From 836e721b6fa78830ce514edb8a9541a930507ab0 Mon Sep 17 00:00:00 2001 From: mahan Date: Tue, 30 Dec 2025 10:38:07 +0330 Subject: [PATCH] feat: refactor institution contract creation classes and endpoints --- .../IInstitutionContractRepository.cs | 6 + .../InstitutionContractCreationTemp.cs | 22 +- .../IInstitutionContractApplication.cs | 102 +- ...itutionContractExtensionCompleteRequest.cs | 7 + ...titutionContractExtensionPaymentRequest.cs | 5 + ...itutionContractExtensionPaymentResponse.cs | 7 + ...InstitutionContractExtensionPlanRequest.cs | 7 + ...nstitutionContractExtensionPlanResponse.cs | 10 +- ...ontractResetDiscountForExtensionRequest.cs | 5 + ...nContractSetDiscountForExtensionRequest.cs | 7 + .../InstitutionContractApplication.cs | 31 +- .../InstitutionContractRepository.cs | 921 +++++++++++++++++- .../institutionContractController.cs | 34 +- 13 files changed, 1095 insertions(+), 69 deletions(-) diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 993e8309..c578d7be 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -165,4 +165,10 @@ public interface IInstitutionContractRepository : IRepository GetIdByInstallmentId(long installmentId); Task GetPreviousContract(long currentInstitutionContractId); Task CreationInquiry(InstitutionContractCreationInquiryRequest request); + Task GetCreationWorkshops(InstitutionContractCreationWorkshopsRequest request); + Task GetCreationInstitutionPlan(InstitutionContractCreationPlanRequest request); + Task GetCreationPaymentMethod(InstitutionContractCreationPaymentRequest request); + Task SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request); + Task ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request); + Task CreationComplete(InstitutionContractExtensionCompleteRequest request); } \ No newline at end of file diff --git a/Company.Domain/InstitutionContractCreationTempAgg/InstitutionContractCreationTemp.cs b/Company.Domain/InstitutionContractCreationTempAgg/InstitutionContractCreationTemp.cs index 9a34955e..9ffa4775 100644 --- a/Company.Domain/InstitutionContractCreationTempAgg/InstitutionContractCreationTemp.cs +++ b/Company.Domain/InstitutionContractCreationTempAgg/InstitutionContractCreationTemp.cs @@ -39,6 +39,8 @@ public class InstitutionContractCreationTemp public string City { get; set; } public string Province { get; set; } public List ContactInfos { get; set; } + public long RepresentativeId { get; set; } + public List Workshops { get; set; } @@ -83,11 +85,25 @@ public class InstitutionContractCreationTemp OneTimePayment = oneTime; } - + + public void SetContractingPartyContactInfo(string address, string city, string province, List requestContactInfos,long representativeId) + { + Address = address; + City = city; + Province = province; + ContactInfos = requestContactInfos; + RepresentativeId = representativeId; + } + } public class InstitutionContractCreationTempLegalParty { + /// + /// آیدی طرف حساب در صورتی که از قبل ایجاد شده باشد + /// + public long Id { get; set; } + /// /// نام شرکت /// @@ -165,6 +181,10 @@ public class InstitutionContractCreationTempLegalParty public class InstitutionContractCreationTempRealParty { + /// + /// آیدی طرف حساب در صورتی که از قبل ایجاد شده باشد + /// + public long Id { get; set; } /// /// کد ملی /// diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs index d53b5d5c..bd450192 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs @@ -5,8 +5,10 @@ using System.Drawing; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; +using _0_Framework.Application.Enums; using _0_Framework.Application.Sms; using CompanyManagment.App.Contracts.Checkout; +using CompanyManagment.App.Contracts.InstitutionContractContactinfo; using CompanyManagment.App.Contracts.TemporaryClientRegistration; using CompanyManagment.App.Contracts.Workshop; using CompanyManagment.App.Contracts.WorkshopPlan; @@ -26,21 +28,21 @@ public interface IInstitutionContractApplication /// اطلاعات قرارداد جدید /// نتیجه عملیات OperationResult Create(CreateInstitutionContract command); - + /// /// تمدید قرارداد موجود /// /// اطلاعات قرارداد برای تمدید /// نتیجه عملیات OperationResult Extension(CreateInstitutionContract command); - + /// /// ویرایش قرارداد موجود /// /// اطلاعات جدید قرارداد /// نتیجه عملیات OperationResult Edit(EditInstitutionContract command); - + /// /// دریافت جزئیات قرارداد برای ویرایش /// @@ -54,7 +56,7 @@ public interface IInstitutionContractApplication /// مدل جستجو /// لیست قراردادها List Search(InstitutionContractSearchModel searchModel); - + /// /// جستجوی جدید در قراردادها /// @@ -76,7 +78,7 @@ public interface IInstitutionContractApplication /// لیست شناسه قراردادها /// لیست قراردادها برای چاپ List PrintAll(List id); - + [Obsolete("استفاده نشود، از متد غیرهمزمان استفاده شود")] /// @@ -146,7 +148,7 @@ public interface IInstitutionContractApplication /// شناسه قرارداد /// نتیجه عملیات OperationResult UnSign(long id); - + /// /// ایجاد حساب کاربری برای طرف قرارداد /// @@ -191,25 +193,24 @@ public interface IInstitutionContractApplication /// /// Task EditAsync(EditInstitutionContractRequest command); - - + + /// /// دریافت لیست طرف حساب هایی که ثبت نام آنها تکمیل شده /// جهت نمایش در کارپوشه /// /// Task> RegistrationWorkflowMainList(); + /// /// دریافت آیتم های کارپوشه ثبت نام /// /// /// Task> RegistrationWorkflowItems(long institutionContractId); - - #endregion - + Task GetVerificationDetails(Guid id); Task> SendVerifyOtp(Guid id); Task> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl); @@ -219,12 +220,29 @@ public interface IInstitutionContractApplication #region Creation - + /// + /// تب ایجاد قرارداد مؤسسه - احراز هویت + /// + /// + /// Task CreationInquiry(InstitutionContractCreationInquiryRequest request); - - #endregion - + /// + /// تب ایجاد قرارداد مؤسسه -مشخصات طرف قرارداد و انتخاب کارگاه ها + /// + /// + /// + Task GetCreationWorkshops( + InstitutionContractCreationWorkshopsRequest request); + /// + /// تب ایجاد قرارداد مؤسسه - مالی + /// + /// + /// + Task GetCreationInstitutionPlan(InstitutionContractCreationPlanRequest request); + + #endregion + #region Extension Task GetExtensionInquiry(long previousContractId); @@ -237,25 +255,31 @@ 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); + Task> GetInstitutionContractSelectList(string search, string selected); #endregion #region Upgrade (Amendment) Task GetAmendmentWorkshops(long institutionContractId); - Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request); + + Task InsertAmendmentTempWorkshops( + InstitutionContractAmendmentTempWorkshopViewModel request); + Task RemoveAmendmentWorkshops(Guid workshopTempId); - Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request); - + + Task GetAmendmentPaymentDetails( + InsitutionContractAmendmentPaymentRequest request); + #endregion Task ResendVerifyLink(long institutionContractId); @@ -267,8 +291,9 @@ public interface IInstitutionContractApplication /// Task PrintOneAsync(long id); - Task SetPendingWorkflow(long entityId,InstitutionContractSigningType signingType); + Task SetPendingWorkflow(long entityId, InstitutionContractSigningType signingType); Task GetIdByInstallmentId(long installmentId); + /// /// تایید قرارداد مالی به صورت دستی /// @@ -276,4 +301,37 @@ public interface IInstitutionContractApplication /// Task VerifyInstitutionContractManually(long institutionContractId); + Task GetCreationPaymentMethod(InstitutionContractCreationPaymentRequest request); + Task SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request); + Task ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request); + Task CreationComplete(InstitutionContractExtensionCompleteRequest request); +} + +public class InstitutionContractCreationWorkshopsResponse +{ + public List WorkshopTemps { get; set; } + public string TotalAmount { get; set; } +} + +public class InstitutionContractCreationWorkshopsRequest +{ + public Guid TempId { get; set; } + public string City { get; set; } + public string Province { get; set; } + public string Address { get; set; } + public List ContactInfos { get; set; } + + /// + /// اطلاعات شخص حقیقی + /// + public CreateInstitutionContractRealPartyRequest RealParty { get; set; } + + /// + /// اطلاعات شخص حقوقی + /// + public CreateInstitutionContractLegalPartyRequest LegalParty { get; set; } + + public LegalType LegalType { get; set; } + + public long RepresentativeId { get; set; } } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionCompleteRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionCompleteRequest.cs index f232760c..8de7ac89 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionCompleteRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionCompleteRequest.cs @@ -3,6 +3,13 @@ using System; namespace CompanyManagment.App.Contracts.InstitutionContract; public class InstitutionContractExtensionCompleteRequest +{ + public Guid TemporaryId { get; set; } + public bool IsInstallment { get; set; } + public long LawId { get; set; } +} + +public class InstitutionContractCreationCompleteRequest { public Guid TemporaryId { get; set; } public bool IsInstallment { get; set; } diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentRequest.cs index 8406a53a..46a68eba 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentRequest.cs @@ -3,6 +3,11 @@ using System; namespace CompanyManagment.App.Contracts.InstitutionContract; public class InstitutionContractExtensionPaymentRequest +{ + public InstitutionContractDuration Duration { get; set; } + public Guid TempId { get; set; } +} +public class InstitutionContractCreationPaymentRequest { public InstitutionContractDuration Duration { get; set; } public Guid TempId { get; set; } diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentResponse.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentResponse.cs index 84906caf..5b9a8812 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentResponse.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPaymentResponse.cs @@ -5,4 +5,11 @@ public class InstitutionContractExtensionPaymentResponse public InstitutionContractPaymentOneTimeViewModel OneTime { get; set; } public InstitutionContractPaymentMonthlyViewModel Monthly { get; set; } +} + +public class InstitutionContractCreationPaymentResponse +{ + public InstitutionContractPaymentOneTimeViewModel OneTime { get; set; } + public InstitutionContractPaymentMonthlyViewModel Monthly { get; set; } + } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanRequest.cs index 40804842..b552161c 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanRequest.cs @@ -5,6 +5,13 @@ using CompanyManagment.App.Contracts.TemporaryClientRegistration; namespace CompanyManagment.App.Contracts.InstitutionContract; public class InstitutionContractExtensionPlanRequest +{ + public List WorkshopTemps { get; set; } + public string TotalAmount { get; set; } + public Guid TempId { get; set; } +} + +public class InstitutionContractCreationPlanRequest { public List WorkshopTemps { get; set; } public string TotalAmount { get; set; } diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanResponse.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanResponse.cs index a38e001b..d4a5a2c7 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanResponse.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractExtensionPlanResponse.cs @@ -7,16 +7,8 @@ public class InstitutionContractExtensionPlanResponse public InstitutionContractExtensionPlanDetail SixMonths { get; set; } public InstitutionContractExtensionPlanDetail TwelveMonths { get; set; } } -public class InstitutionContractExtensionPlanDetail +public class InstitutionContractExtensionPlanDetail:InstitutionContractCreationPlanDetail { - public string ContractStart { get; set; } - public string ContractEnd { get; set; } - public string OneMonthPaymentDiscounted { get; set; } - public string OneMonthDiscount { get; set; } - public string OneMonthOriginalPayment { get; set; } - public string TotalPayment { get; set; } - public string DailyCompenseation { get; set; } - public string Obligation { get; set; } } public class InstitutionContractCreationPlanResponse diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractResetDiscountForExtensionRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractResetDiscountForExtensionRequest.cs index 7011e364..43dbe2aa 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractResetDiscountForExtensionRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractResetDiscountForExtensionRequest.cs @@ -3,6 +3,11 @@ using System; namespace CompanyManagment.App.Contracts.InstitutionContract; public class InstitutionContractResetDiscountForExtensionRequest +{ + public Guid TempId { get; set; } + public bool IsInstallment { get; set; } +} +public class InstitutionContractResetCreationForExtensionRequest { public Guid TempId { get; set; } public bool IsInstallment { get; set; } diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractSetDiscountForExtensionRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractSetDiscountForExtensionRequest.cs index 3df40e5e..c98deddb 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractSetDiscountForExtensionRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractSetDiscountForExtensionRequest.cs @@ -3,6 +3,13 @@ using System; namespace CompanyManagment.App.Contracts.InstitutionContract; public class InstitutionContractSetDiscountForExtensionRequest +{ + public Guid TempId { get; set; } + public int DiscountPercentage { get; set; } + public double TotalAmount { get; set; } + public bool IsInstallment { get; set; } +} +public class InstitutionContractSetDiscountForCreationRequest { public Guid TempId { get; set; } public int DiscountPercentage { get; set; } diff --git a/CompanyManagment.Application/InstitutionContractApplication.cs b/CompanyManagment.Application/InstitutionContractApplication.cs index 580bdf1d..e186b36b 100644 --- a/CompanyManagment.Application/InstitutionContractApplication.cs +++ b/CompanyManagment.Application/InstitutionContractApplication.cs @@ -1448,7 +1448,16 @@ public class InstitutionContractApplication : IInstitutionContractApplication { return _institutionContractRepository.CreationInquiry(request); } - + + public Task GetCreationWorkshops(InstitutionContractCreationWorkshopsRequest request) + { + return _institutionContractRepository.GetCreationWorkshops(request); + } + + public Task GetCreationInstitutionPlan(InstitutionContractCreationPlanRequest request) + { + return _institutionContractRepository.GetCreationInstitutionPlan(request); + } public async Task GetExtensionInquiry(long previousContractId) @@ -1669,6 +1678,26 @@ public class InstitutionContractApplication : IInstitutionContractApplication return op.Succcedded(); } + public Task GetCreationPaymentMethod(InstitutionContractCreationPaymentRequest request) + { + return _institutionContractRepository.GetCreationPaymentMethod(request); + } + + public Task SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request) + { + return _institutionContractRepository.SetDiscountForCreation(request); + } + + public Task ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request) + { + return _institutionContractRepository.ResetDiscountForCreation(request); + } + + public Task CreationComplete(InstitutionContractExtensionCompleteRequest request) + { + return _institutionContractRepository.CreationComplete(request); + } + private async Task> CreateLegalContractingPartyEntity( CreateInstitutionContractLegalPartyRequest request, long representativeId, string address, string city, string state) diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index c4b16059..d96c3a24 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -36,7 +36,9 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using _0_Framework.Application.UID; +using AccountManagement.Application.Contracts.Account; using Company.Domain.InstitutionContractCreationTempAgg; +using Company.Domain.RepresentativeAgg; using Company.Domain.TemporaryClientRegistrationAgg; using ContractingPartyAccount = Company.Domain.ContractingPartyAccountAgg.ContractingPartyAccount; using FinancialStatment = Company.Domain.FinancialStatmentAgg.FinancialStatment; @@ -60,8 +62,8 @@ public class InstitutionContractRepository : RepositoryBase _hubContext; private readonly ILogger _logger; - private readonly IUidService _uidService; - + private readonly IUidService _uidService; + private readonly InstitutionContratVerificationParty _firstParty = new() { @@ -74,6 +76,9 @@ public class InstitutionContractRepository : RepositoryBase hubContext, - ILogger logger, IUidService uidService, IContractingPartyTempRepository contractingPartyTempRepository) : base(context) + ILogger logger, IUidService uidService, + IContractingPartyTempRepository contractingPartyTempRepository, IPersonalContractingPartyRepository contractingPartyRepository, IRepresentativeRepository representativeRepository, IAccountApplication accountApplication) : base(context) { _context = context; _employerRepository = employerRepository; @@ -95,6 +101,9 @@ public class InstitutionContractRepository : RepositoryBase("InstitutionContractExtensionTemp"); _institutionAmendmentTemp = @@ -4968,9 +4977,9 @@ public class InstitutionContractRepository : RepositoryBase x.Nationalcode == nationalCode); + long contractingPartyId = contractingParty?.id ?? 0; if (contractingParty != null) { - if (contractingParty.DateOfBirth != null && contractingParty.DateOfBirth != dateOfBirthGr) throw new BadRequestException("تاریخ تولد مطابقت ندارد"); @@ -5005,13 +5014,27 @@ public class InstitutionContractRepository : RepositoryBase GetCreationWorkshops( + InstitutionContractCreationWorkshopsRequest request) + { + var transaction = await _context.Database.BeginTransactionAsync(); + PersonalContractingParty contractingParty = null; + switch (request.LegalType) + { + case LegalType.Legal: + var legalCommand = request.LegalParty; + + var legalPersonalContractingParty = _context.PersonalContractingParties + .FirstOrDefault(x => x.NationalId == legalCommand.NationalId); + if (!request.LegalParty.IsAuth) + { + if (legalPersonalContractingParty is { IsAuthenticated: false }) + { + legalPersonalContractingParty.UnAuthenticateLegalEdit(legalCommand.FName, legalCommand.LName, + legalCommand.FatherName, legalCommand.IdNumber, legalPersonalContractingParty.IdNumberSeri, + legalPersonalContractingParty.IdNumberSerial, legalCommand.BirthDateFa, legalCommand.Gender, + legalCommand.PhoneNumber); + } + } + + legalPersonalContractingParty?.EditLegalPartyFromInstitution(legalCommand.Position, + legalCommand.CompanyName, + legalCommand.RegisterId, legalCommand.NationalId); + + contractingParty = legalPersonalContractingParty; + break; + case LegalType.Real: + var realCommand = request.RealParty; + var personalContractingParty = _context.PersonalContractingParties + .FirstOrDefault(x => x.Nationalcode == realCommand.NationalCode); + if (!request.RealParty.IsAuth) + { + if (personalContractingParty is { IsAuthenticated: false }) + { + personalContractingParty.UnAuthenticateRealEdit(realCommand.FName, realCommand.LName, + realCommand.FatherName, realCommand.IdNumber, personalContractingParty.IdNumberSeri, + personalContractingParty.IdNumberSerial, realCommand.BirthDateFa, realCommand.Gender, + realCommand.PhoneNumber); + } + + contractingParty = personalContractingParty; + } + + break; + } + + await SaveChangesAsync(); + await transaction.CommitAsync(); + + var creationTemp = await _institutionContractCreationTemp.Find(x => x.Id == request.TempId) + .FirstOrDefaultAsync(); + + if (creationTemp == null) + { + throw new BadRequestException("دیتای درخواست شده نامعتبر است"); + } + + if (contractingParty == null) + { + throw new BadRequestException("طرف قرارداد یافت نشد"); + } + + var employerWorkshopIds = _context.Employers + .Where(x => x.ContractingPartyId == contractingParty.id) + .Include(x => x.WorkshopEmployers) + .SelectMany(x => x.WorkshopEmployers).Select(x => x.WorkshopId).Distinct().ToList(); + + creationTemp.SetContractingPartyContactInfo(request.Address, request.City, request.Province, + request.ContactInfos,request.RepresentativeId); + await _institutionContractCreationTemp.ReplaceOneAsync( + x => x.Id == creationTemp.Id, + creationTemp + ); + + + var workshopsNotInInstitution = employerWorkshopIds.ToList(); + + var workshops = await _context.Workshops + .Where(x => employerWorkshopIds.Contains(x.id)) + .ToListAsync(); + + var notIncludeWorskhopsLeftWork = await _context.LeftWorkList + .Where(x => workshopsNotInInstitution.Contains(x.WorkshopId) && x.StartWorkDate <= DateTime.Now && + x.LeftWorkDate >= DateTime.Now) + .GroupBy(x => x.WorkshopId).ToListAsync(); + + var workshopDetails = workshopsNotInInstitution.Select(x => + { + var workshop = workshops.FirstOrDefault(w => w.id == x); + var leftWorks = notIncludeWorskhopsLeftWork.FirstOrDefault(l => l.Key == x); + return new WorkshopTempViewModel() + { + WorkshopName = workshop?.WorkshopName ?? "فاقد کارگاه", + WorkshopServicesAmount = 0, + WorkshopServicesAmountStr = "0", + WorkshopId = x, + Id = 0, + ContractAndCheckout = false, + ContractAndCheckoutInPerson = false, + CustomizeCheckout = false, + CountPerson = leftWorks?.Count() ?? 0, + Insurance = false, + InsuranceInPerson = false, + RollCall = false, + RollCallInPerson = false, + }; + }).ToList(); + + + var res = new InstitutionContractCreationWorkshopsResponse() + { + TotalAmount = workshopDetails.Sum(x => x.WorkshopServicesAmount).ToMoney(), + WorkshopTemps = workshopDetails + }; + return res; + } + + public async Task GetCreationInstitutionPlan( + InstitutionContractCreationPlanRequest request) + { + if (request.WorkshopTemps.Count == 0) + throw new BadRequestException("هیچ کارگاهی یافت نشد"); + + bool hasInPerson = request.WorkshopTemps.Any(x => x.ContractAndCheckoutInPerson); + double amount = request.TotalAmount.MoneyToDouble(); + + var institutionTemp = + await _institutionContractCreationTemp.Find(x => x.Id == request.TempId).FirstOrDefaultAsync(); + + + var res = new InstitutionContractCreationPlanResponse(); + + + var contractStart = DateTime.Now; + + + if (hasInPerson) + { + res.OneMonth = null; + + res.ThreeMonths = null; + + res.SixMonths = null; + + res.TwelveMonths = + CalculateInstitutionPlan(InstitutionContractDuration.TwelveMonths, amount, true, contractStart); + } + else + { + res.OneMonth = + CalculateInstitutionPlan(InstitutionContractDuration.OneMonth, amount, false, contractStart); + + res.ThreeMonths = + CalculateInstitutionPlan(InstitutionContractDuration.ThreeMonths, amount, false, contractStart); + + res.SixMonths = + CalculateInstitutionPlan(InstitutionContractDuration.SixMonths, amount, false, contractStart); + + res.TwelveMonths = CalculateInstitutionPlan(InstitutionContractDuration.TwelveMonths, amount, false, + contractStart); + } + + var workshops = request.WorkshopTemps + .Select(x => new InstitutionContractCreationTempWorkshop(x.WorkshopName, x.CountPerson, + x.ContractAndCheckout, x.ContractAndCheckoutInPerson, + x.Insurance, x.InsuranceInPerson, x.RollCall, x.RollCall, + x.RollCallInPerson, x.WorkshopServicesAmount, x.WorkshopId)).ToList(); + + institutionTemp.SetWorkshopsAndPlanAmounts(workshops, res.OneMonth, res.ThreeMonths, res.SixMonths, + res.TwelveMonths, hasInPerson); + + await _institutionContractCreationTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, institutionTemp); + + return res; + } + + public async Task GetCreationPaymentMethod( + InstitutionContractCreationPaymentRequest request) + { + var institutionTemp = await _institutionContractCreationTemp + .Find(x => x.Id == request.TempId).FirstOrDefaultAsync(); + + if (institutionTemp == null) + throw new BadRequestException("اطلاعات وارد شده نامعتبر است"); + + var duration = request.Duration; + + + var selectedPlan = duration switch + { + InstitutionContractDuration.OneMonth => institutionTemp.OneMonth, + InstitutionContractDuration.ThreeMonths => institutionTemp.ThreeMonths, + InstitutionContractDuration.SixMonths => institutionTemp.SixMonths, + InstitutionContractDuration.TwelveMonths => institutionTemp.TwelveMonths, + _ => throw new ArgumentOutOfRangeException() + }; + + var baseAmount = selectedPlan.TotalPayment.MoneyToDouble(); + var vatOrDiscount = baseAmount * 0.10; + + var calculation = institutionTemp.HasContractInPerson + ? CalculateInPersonPayment((InstitutionContractExtensionPlanDetail)selectedPlan, baseAmount, vatOrDiscount, + request.Duration) + : CalculateOnlinePayment(baseAmount, vatOrDiscount); + + institutionTemp.SetAmountAndDuration(duration, calculation.Monthly, calculation.OneTime); + + await _institutionContractCreationTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, institutionTemp); + + var res = new InstitutionContractCreationPaymentResponse() + { + Monthly = calculation.Monthly, + OneTime = calculation.OneTime + }; + return res; + } + + public async Task SetDiscountForCreation( + InstitutionContractSetDiscountForCreationRequest request) + { + if (request.DiscountPercentage <= 0) + throw new BadRequestException("مقدار تخفیف نمی‌تواند برابر یا کمتر از صفر باشد"); + if (request.DiscountPercentage >= 100) + { + throw new BadRequestException("مقدار تخفیف نمی‌تواند برابر یا بیشتر از صد باشد"); + } + + var institutionTemp = await _institutionContractCreationTemp.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 selectedPlan = institutionTemp.Duration switch + { + InstitutionContractDuration.OneMonth => institutionTemp.OneMonth, + InstitutionContractDuration.ThreeMonths => institutionTemp.ThreeMonths, + InstitutionContractDuration.SixMonths => institutionTemp.SixMonths, + InstitutionContractDuration.TwelveMonths => institutionTemp.TwelveMonths, + _ => throw new ArgumentOutOfRangeException() + }; + var calculateRequest = new InstitutionContractSetDiscountRequest() + { + Duration = institutionTemp.Duration.Value, + TotalAmount = request.TotalAmount, + DiscountPercentage = request.DiscountPercentage, + IsInstallment = request.IsInstallment, + OneMonthAmount = selectedPlan.OneMonthPaymentDiscounted.MoneyToDouble() + }; + var res = CalculateDiscount(calculateRequest, selectedPlan.ContractStart); + + //این به این دلیل هست که متد caclulate discount یکی از مقادیر رو پر میکنه و ما نیاز داریم هر دو مقدار رو داشته باشیم + if (request.IsInstallment) + { + var onetime = institutionTemp.OneTimePayment; + onetime.TotalAmountWithoutDiscount = onetime.TotalAmount; + + onetime.OneMonthPaymentWithoutDiscount = selectedPlan.OneMonthPaymentDiscounted; + institutionTemp.OneTimePayment.TotalAmountWithoutDiscount = onetime.TotalAmount; + institutionTemp.OneTimePayment.OneMonthPaymentWithoutDiscount = selectedPlan.OneMonthPaymentDiscounted; + + res.OneTime = new() + { + PaymentAmount = onetime.PaymentAmount, + Tax = onetime.Tax, + TotalAmount = onetime.TotalAmount, + DiscountedAmount = onetime.DiscountedAmount, + DiscountPercetage = onetime.DiscountPercetage, + }; + + + institutionTemp.MonthlyPayment = new() + { + Installments = res.Monthly.Installments, + PaymentAmount = res.Monthly.PaymentAmount, + Tax = res.Monthly.Tax, + TotalAmount = res.Monthly.TotalAmount, + DiscountedAmount = res.Monthly.DiscountedAmount, + DiscountPercetage = res.Monthly.DiscountPercetage, + TotalAmountWithoutDiscount = institutionTemp.MonthlyPayment.TotalAmount, + OneMonthPaymentWithoutDiscount = selectedPlan.OneMonthPaymentDiscounted, + }; + + selectedPlan.TotalPayment = res.Monthly.TotalAmount; + selectedPlan.Obligation = res.Monthly.Obligation; + selectedPlan.OneMonthPaymentDiscounted = res.Monthly.OneMonthAmount; + selectedPlan.DailyCompenseation = (res.Monthly.OneMonthAmount.MoneyToDouble() * 0.10).ToMoney(); + } + else + { + var monthly = institutionTemp.MonthlyPayment; + + institutionTemp.MonthlyPayment.TotalAmountWithoutDiscount = monthly.TotalAmount; + + res.Monthly = new() + { + PaymentAmount = monthly.PaymentAmount, + Tax = monthly.Tax, + TotalAmount = monthly.TotalAmount, + DiscountedAmount = monthly.DiscountedAmount, + DiscountPercetage = monthly.DiscountPercetage, + Installments = monthly.Installments, + }; + + + institutionTemp.OneTimePayment = new() + { + PaymentAmount = res.OneTime.PaymentAmount, + Tax = res.OneTime.Tax, + TotalAmount = res.OneTime.TotalAmount, + DiscountedAmount = res.OneTime.DiscountedAmount, + DiscountPercetage = res.OneTime.DiscountPercetage, + TotalAmountWithoutDiscount = institutionTemp.OneTimePayment.TotalAmount, + OneMonthPaymentWithoutDiscount = selectedPlan.OneMonthPaymentDiscounted, + }; + selectedPlan.TotalPayment = res.OneTime.TotalAmount; + selectedPlan.Obligation = res.OneTime.Obligation; + selectedPlan.OneMonthPaymentDiscounted = res.OneTime.OneMonthAmount; + selectedPlan.DailyCompenseation = (res.OneTime.OneMonthAmount.MoneyToDouble() * 0.10).ToMoney(); + } + + switch (institutionTemp.Duration) + { + case InstitutionContractDuration.OneMonth: + institutionTemp.OneMonth = selectedPlan; + break; + case InstitutionContractDuration.ThreeMonths: + institutionTemp.ThreeMonths = selectedPlan; + break; + case InstitutionContractDuration.SixMonths: + institutionTemp.SixMonths = selectedPlan; + break; + case InstitutionContractDuration.TwelveMonths: + institutionTemp.TwelveMonths = selectedPlan; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + await _institutionContractCreationTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, + institutionTemp); + + return new() + { + OneTime = res.OneTime, + Monthly = res.Monthly + }; + } + + public async Task ResetDiscountForCreation( + InstitutionContractResetDiscountForExtensionRequest request) + { + var institutionTemp = await _institutionContractCreationTemp.Find(x => x.Id == request.TempId) + .FirstOrDefaultAsync(); + if (institutionTemp == null) + { + throw new BadRequestException("اطلاعات وارد شده نامعتبر است"); + } + + InstitutionContractDiscountMonthlyViewModel monthlyPayment = null; + InstitutionContractDiscountOneTimeViewModel oneTimePayment = null; + var selectedPlan = institutionTemp.Duration switch + { + InstitutionContractDuration.OneMonth => institutionTemp.OneMonth, + InstitutionContractDuration.ThreeMonths => institutionTemp.ThreeMonths, + InstitutionContractDuration.SixMonths => institutionTemp.SixMonths, + InstitutionContractDuration.TwelveMonths => institutionTemp.TwelveMonths, + _ => throw new ArgumentOutOfRangeException() + }; + if (request.IsInstallment) + { + var prevMonthlyPayment = institutionTemp.MonthlyPayment; + var resetTotalAmount = prevMonthlyPayment.TotalAmountWithoutDiscount.MoneyToDouble(); + var resetTax = (resetTotalAmount * 0.10); + var paymentAmount = (resetTotalAmount + resetTax); + var newOneMonthAmount = prevMonthlyPayment.OneMonthPaymentWithoutDiscount.MoneyToDouble(); + monthlyPayment = new InstitutionContractDiscountMonthlyViewModel() + { + DiscountPercetage = 0, + DiscountedAmount = "0", + PaymentAmount = paymentAmount.ToMoney(), + Tax = resetTax.ToMoney(), + TotalAmount = resetTotalAmount.ToMoney(), + Installments = InstitutionMonthlyInstallmentCaculation((int)institutionTemp.Duration.Value, + paymentAmount, selectedPlan.ContractStart), + OneMonthAmount = newOneMonthAmount.ToMoney(), + Obligation = resetTotalAmount.ToMoney() + }; + institutionTemp.MonthlyPayment = new InstitutionContractPaymentMonthlyViewModel() + { + Installments = monthlyPayment.Installments, + PaymentAmount = monthlyPayment.PaymentAmount, + Tax = monthlyPayment.Tax, + TotalAmount = monthlyPayment.TotalAmount, + DiscountedAmount = monthlyPayment.DiscountedAmount, + DiscountPercetage = monthlyPayment.DiscountPercetage, + }; + selectedPlan.TotalPayment = monthlyPayment.TotalAmount; + selectedPlan.Obligation = monthlyPayment.Obligation; + selectedPlan.OneMonthPaymentDiscounted = monthlyPayment.OneMonthAmount; + selectedPlan.DailyCompenseation = (monthlyPayment.OneMonthAmount.MoneyToDouble() * 0.10).ToMoney(); + + switch (institutionTemp.Duration) + { + case InstitutionContractDuration.OneMonth: + institutionTemp.OneMonth = selectedPlan; + break; + case InstitutionContractDuration.ThreeMonths: + institutionTemp.ThreeMonths = selectedPlan; + break; + case InstitutionContractDuration.SixMonths: + institutionTemp.SixMonths = selectedPlan; + break; + case InstitutionContractDuration.TwelveMonths: + institutionTemp.TwelveMonths = selectedPlan; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + await _institutionContractCreationTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, + institutionTemp); + } + else + { + var prevOneTimePayment = institutionTemp.OneTimePayment; + var resetTotalAmount = prevOneTimePayment.TotalAmountWithoutDiscount.MoneyToDouble(); + var resetTax = (resetTotalAmount * 0.10); + var newOneMonthAmount = prevOneTimePayment.OneMonthPaymentWithoutDiscount.MoneyToDouble(); + + oneTimePayment = new InstitutionContractDiscountOneTimeViewModel() + { + DiscountPercetage = 0, + DiscountedAmount = "0", + TotalAmount = resetTotalAmount.ToMoney(), + Tax = resetTax.ToMoney(), + PaymentAmount = (resetTotalAmount + resetTax).ToMoney(), + OneMonthAmount = newOneMonthAmount.ToMoney(), + Obligation = resetTotalAmount.ToMoney() + }; + institutionTemp.OneTimePayment = new InstitutionContractPaymentOneTimeViewModel() + { + PaymentAmount = oneTimePayment.PaymentAmount, + Tax = oneTimePayment.Tax, + TotalAmount = oneTimePayment.TotalAmount, + DiscountedAmount = oneTimePayment.DiscountedAmount, + DiscountPercetage = oneTimePayment.DiscountPercetage, + TotalAmountWithoutDiscount = institutionTemp.OneTimePayment.TotalAmount, + OneMonthPaymentWithoutDiscount = institutionTemp.OneTimePayment.OneMonthPaymentWithoutDiscount + }; + selectedPlan.TotalPayment = institutionTemp.HasContractInPerson + ? (oneTimePayment.TotalAmount.MoneyToDouble() / (0.9)).ToMoney() + : oneTimePayment.TotalAmount; + selectedPlan.Obligation = oneTimePayment.Obligation; + selectedPlan.OneMonthPaymentDiscounted = oneTimePayment.OneMonthAmount; + selectedPlan.DailyCompenseation = (oneTimePayment.OneMonthAmount.MoneyToDouble() * 0.10).ToMoney(); + + switch (institutionTemp.Duration) + { + case InstitutionContractDuration.OneMonth: + institutionTemp.OneMonth = selectedPlan; + break; + case InstitutionContractDuration.ThreeMonths: + institutionTemp.ThreeMonths = selectedPlan; + break; + case InstitutionContractDuration.SixMonths: + institutionTemp.SixMonths = selectedPlan; + break; + case InstitutionContractDuration.TwelveMonths: + institutionTemp.TwelveMonths = selectedPlan; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + await _institutionContractCreationTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, + institutionTemp); + } + + return new InstitutionContractDiscountResponse() + { + OneTime = oneTimePayment, + Monthly = monthlyPayment + }; + } + + + public async Task CreationComplete(InstitutionContractExtensionCompleteRequest request) + { + var institutionContractTemp = await _institutionContractCreationTemp.Find(x => x.Id == request.TemporaryId) + .FirstOrDefaultAsync(); + + if (institutionContractTemp == null) + throw new BadRequestException("اطلاعات وارد شده نامعتبر است"); + + var selectedDuration = institutionContractTemp.Duration switch + { + InstitutionContractDuration.OneMonth => institutionContractTemp.OneMonth, + InstitutionContractDuration.ThreeMonths => institutionContractTemp.ThreeMonths, + InstitutionContractDuration.SixMonths => institutionContractTemp.SixMonths, + InstitutionContractDuration.TwelveMonths => institutionContractTemp.TwelveMonths, + _ => throw new ArgumentOutOfRangeException() + }; + + var contractingPartyId = institutionContractTemp.ContractingPartyLegalType == LegalType.Real + ? institutionContractTemp.RealParty.Id + : institutionContractTemp.LegalParty.Id; + PersonalContractingParty contractingParty; + if (contractingPartyId > 0) + { + contractingParty = await _context.PersonalContractingParties + .FirstOrDefaultAsync(x => x.id == contractingPartyId); + } + else + { + OperationResult contractingPartyResult = institutionContractTemp.ContractingPartyLegalType switch + { + LegalType.Legal => await CreateLegalContractingPartyEntity(institutionContractTemp.LegalParty, institutionContractTemp.RepresentativeId, + institutionContractTemp.Address, + institutionContractTemp.City, institutionContractTemp.Province), + LegalType.Real => await CreateRealContractingPartyEntity(institutionContractTemp.RealParty, institutionContractTemp.RepresentativeId, + institutionContractTemp.Address, + institutionContractTemp.City, institutionContractTemp.Province), + _ => throw new BadRequestException("نوع طرف قرارداد مشخص نشده است") + }; + if (!contractingPartyResult.IsSuccedded) + throw new BadRequestException(contractingPartyResult.Message); + contractingParty = contractingPartyResult.Data; + } + + + //این به این خواطر هست که قبل از این آیدی برای این بوده که بفهمیم طرف حساب وجود داره یا نه ولی الان که مطمئن هستیم که وجود داره ماهیت این آیدی فرق کرده + contractingPartyId = contractingParty.id; + + var payment = request.IsInstallment + ? institutionContractTemp.MonthlyPayment + : institutionContractTemp.OneTimePayment; + + bool dateMessages = false; + string dateMaessageResult = String.Empty; + var opration = new OperationResult(); + + var contractStart = selectedDuration.ContractStart; + + var representative = _representativeRepository.Get(institutionContractTemp.RepresentativeId); + if (representative == null) + return opration.Failed("معرف مورد نظر یافت نشد"); + + if (_context.InstitutionContractSet.Any(x => + x.ContractingPartyId == contractingPartyId && x.IsActiveString == "true")) + return opration.Failed("برای این طرف قرارداد قبلا قرارداد اصلی ایجاد شده است، شما میتوانید از تمدید استفاده کنید"); + + + if (string.IsNullOrWhiteSpace(contractStart)) + { + dateMaessageResult = "تاریخ قراراداد اجباری است. "; + dateMessages = true; + } + + if (string.IsNullOrWhiteSpace(contractStart)) + { + dateMaessageResult += "تاریخ شروع قراراداد اجباری است. "; + dateMessages = true; + } + + if (string.IsNullOrWhiteSpace(selectedDuration.ContractEnd)) + { + dateMaessageResult += "تاریخ پایان قراراداد اجباری است. "; + dateMessages = true; + } + + if (dateMessages) + return opration.Failed(dateMaessageResult); + + + var syear = contractStart.Substring(0, 4); + var smonth = contractStart.Substring(5, 2); + var sday = contractStart.Substring(8, 2); + //شماره قرارداد + var contractNo = $"{syear}{smonth}{sday}/{contractingParty.ArchiveCode}/0"; + + + var contractStartGr = contractStart.ToGeorgianDateTime(); + var contractEndGr = selectedDuration.ContractEnd.ToGeorgianDateTime(); + + var contractDateGr = contractStart.ToGeorgianDateTime(); + + + if (institutionContractTemp.Address != null && institutionContractTemp.Province == null) + { + return opration.Failed("لطفا استان و شهر را انتخاب کنید"); + } + + if ((institutionContractTemp.Address != null && institutionContractTemp.Province != null) && + institutionContractTemp.City == "شهرستان") + { + return opration.Failed("لطفا شهر را انتخاب کنید"); + } + + if (institutionContractTemp.Address == null && institutionContractTemp.Province != null) + { + return opration.Failed("لطفا آدرس را وارد کنید"); + } + + var hasValueAddedTax = payment.Tax.MoneyToDouble() > 0 ? "true" : "false"; + + var workshopsCount = institutionContractTemp.Workshops.Count.ToString(); + + var workshopDetails = institutionContractTemp + .Workshops.Select(x => + { + var res = new InstitutionContractWorkshopInitial(x.WorkshopName, x.RollCall, x.RollCallInPerson, + x.CustomizeCheckout, + x.ContractAndCheckout, + x.ContractAndCheckoutInPerson, x.Insurance, x.InsuranceInPerson, x.CountPerson, x.Price); + if (x.WorkshopId != 0) + { + res.SetWorkshopId(x.WorkshopId); + } + + return res; + }).ToList(); + + var employeeCount = institutionContractTemp.Workshops.Sum(x => x.CountPerson).ToString(); + + var oneMonthPayment = selectedDuration.OneMonthPaymentDiscounted.MoneyToDouble(); + + + var contractingPartyFullName = contractingParty.IsLegal=="حقیقی" + ? contractingParty.FName + " " + contractingParty.LName + : contractingParty.LName; + + var totalAmount = payment.PaymentAmount.MoneyToDouble(); + + + var transaction = await _context.Database.BeginTransactionAsync(); + + var entity = new InstitutionContract(contractNo, representative.id, + representative.FullName, + contractingPartyId, + contractingPartyFullName, contractDateGr, contractStart, + institutionContractTemp.Province, institutionContractTemp.City, + institutionContractTemp.Address, contractStartGr, + contractStart, contractEndGr, selectedDuration.ContractEnd, + oneMonthPayment, selectedDuration.DailyCompenseation.MoneyToDouble(), + selectedDuration.Obligation.MoneyToDouble(), totalAmount, + 0, workshopsCount, employeeCount,null, + "NotOfficial", "JobRelation", hasValueAddedTax, + payment.Tax.MoneyToDouble(), [], + request.LawId, payment.DiscountPercetage, payment.DiscountedAmount.MoneyToDouble()); + + await CreateAsync(entity); + await SaveChangesAsync(); + foreach (var workshop in institutionContractTemp.Workshops) + { + var workshopDetail = new InstitutionContractWorkshopInitial( + workshop.WorkshopName, workshop.RollCall, workshop.RollCallInPerson, + workshop.CustomizeCheckout, workshop.ContractAndCheckout, + workshop.ContractAndCheckoutInPerson, workshop.Insurance, + workshop.InsuranceInPerson, workshop.CountPerson, workshop.Price); + + workshopDetail.SetWorkshopGroup(entity.WorkshopGroup); + + if (workshop.WorkshopId != 0) + { + workshopDetail.SetWorkshopId(workshop.WorkshopId); + } + // Set parent reference + + // Add to the parent's collection + entity.WorkshopGroup.InitialWorkshops.Add(workshopDetail); + } + + // Save the changes again + await SaveChangesAsync(); + + + FinancialStatment financialStatement; + if (_context.FinancialStatments.Any(x => x.ContractingPartyId == contractingParty.id)) + { + financialStatement = + await _context.FinancialStatments.FirstOrDefaultAsync(x => x.ContractingPartyId == contractingParty.id); + } + else + { + financialStatement = new FinancialStatment(contractingParty.id, contractingPartyFullName); + await _context.AddAsync(financialStatement); + } + + + if (request.IsInstallment && payment is InstitutionContractPaymentMonthlyViewModel monthly) + { + var installments = monthly.Installments.Select(x => + new InstitutionContractInstallment(x.InstalmentDate.ToGeorgianDateTime(), + x.InstallmentAmountStr.MoneyToDouble(), "")).ToList(); + + // دریافت مبلغ اولین قسط + //این کار برای این هست که اولین قسط باید با تاریخ امروز باشد و باید به وضعیت مالی بدهی ایجاد شود که یوزر اولین بدهی را وارد کند + var firstInstallmentAmount = installments.First().Amount; + + // حذف اولین قسط + installments.RemoveAt(0); + + // ایجاد قسط جدید با تاریخ امروز + var todayInstallment = new InstitutionContractInstallment(DateTime.Today, firstInstallmentAmount, ""); + + + // اضافه کردن قسط جدید به ابتدای لیست + installments.Insert(0, todayInstallment); + + entity.SetInstallments(installments); + await SaveChangesAsync(); + } + + foreach (var contactInfo in institutionContractTemp.ContactInfos) + { + if (contactInfo.PhoneNumber != null) + { + var contactinfo = new InstitutionContractContactInfo(contactInfo.PhoneType, + contactInfo.Position, contactInfo.PhoneNumber, contactInfo.FnameLname, entity.id, + contactInfo.SendSmsString == "true"); + + _context.InstitutionContractContactInfos.Add(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); + + await SaveChangesAsync(); + + await _smsService.SendInstitutionCreationVerificationLink(contractingParty.Phone, contractingPartyFullName, + entity.PublicId, contractingParty.id, entity.id); + + + await SaveChangesAsync(); + await transaction.CommitAsync(); + return opration.Succcedded(); + } + + private async Task> CreateLegalContractingPartyEntity( + InstitutionContractCreationTempLegalParty request, long representativeId, string address, string city, + string state) + { + var opration = new OperationResult(); + + + 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.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("شناسه ملی وارد شده تکراری است"); + } + + 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); + + 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(); + + return opration.Succcedded(legalContractingParty); + } + + private async Task> CreateRealContractingPartyEntity( + InstitutionContractCreationTempRealParty request, long representativeId, string address, + string city, string province) + { + var operation = new OperationResult(); + + + if (representativeId < 1) + return operation.Failed("لطفا معرف را انتخاب کنید"); + + if (_contractingPartyRepository.Exists(x => x.Nationalcode == request.NationalCode)) + { + return operation.Failed("کد ملی وارد شده تکراری است"); + } + + var archiveCode = _contractingPartyRepository.GetLastNewArchiveCode(); + + if (request.NationalCode.NationalCodeValid() != "valid") + { + return operation.Failed("کد ملی وارد شده نا معتبر است"); + } + + var representative = _representativeRepository.GetDetails(representativeId); + + 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); + + 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(); + + return operation.Succcedded(personalContractingParty); + } #endregion diff --git a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs index 0548a2b4..d54893a1 100644 --- a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs +++ b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs @@ -536,45 +536,45 @@ public class institutionContractController : AdminBaseController return res; } - [HttpPost("create/workshops")] - public async Task> CreationWorkshops([FromBody] InstitutionContractCreationWorkshopsRequest request) + [HttpPost("creation/workshops")] + public async Task> CreationWorkshops([FromBody] InstitutionContractCreationWorkshopsRequest request) { var res =await _institutionContractApplication.GetCreationWorkshops(request); return res; } - [HttpPost("extenstion/institution-plan")] - public async Task> ExtensionInstitutionPlan([FromBody]InstitutionContractExtensionPlanRequest request) + [HttpPost("creation/institution-plan")] + public async Task> CreationInstitutionPlan([FromBody]InstitutionContractCreationPlanRequest request) { - var res =await _institutionContractApplication.GetExtensionInstitutionPlan(request); + var res =await _institutionContractApplication.GetCreationInstitutionPlan(request); return res; } - [HttpPost("extenstion/payment-method")] - public async Task> GetExtensionPaymentMethod([FromBody]InstitutionContractExtensionPaymentRequest request) + [HttpPost("creation/payment-method")] + public async Task> GetCreationPaymentMethod([FromBody]InstitutionContractCreationPaymentRequest request) { - var res =await _institutionContractApplication.GetExtensionPaymentMethod(request); + var res =await _institutionContractApplication.GetCreationPaymentMethod(request); return res; } - [HttpPost("extension/set-discount")] - public async Task> SetDiscountForExtension([FromBody]InstitutionContractSetDiscountForExtensionRequest request) + [HttpPost("creation/set-discount")] + public async Task> SetDiscountForCreation([FromBody]InstitutionContractSetDiscountForCreationRequest request) { - var res =await _institutionContractApplication.SetDiscountForExtension(request); + var res =await _institutionContractApplication.SetDiscountForCreation(request); return res; } - [HttpPost("extension/reset-discount")] - public async Task> ResetDiscountForExtension([FromBody]InstitutionContractResetDiscountForExtensionRequest request) + [HttpPost("creation/reset-discount")] + public async Task> ResetDiscountForCreation([FromBody]InstitutionContractResetDiscountForExtensionRequest request) { - var res =await _institutionContractApplication.ResetDiscountForExtension(request); + var res =await _institutionContractApplication.ResetDiscountForCreation(request); return res; } - [HttpPost("extenstion/complete")] - public async Task> ExtensionComplete([FromBody]InstitutionContractExtensionCompleteRequest request) + [HttpPost("creation/complete")] + public async Task> CreationComplete([FromBody]InstitutionContractExtensionCompleteRequest request) { - var res =await _institutionContractApplication.ExtensionComplete(request); + var res =await _institutionContractApplication.CreationComplete(request); return res; }