From 5d8173151275497e2d2106243b18a46bc8575f77 Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 29 Nov 2025 11:11:34 +0330 Subject: [PATCH] Add reset discount functionality for institution contract creation and extension --- .../IInstitutionContractRepository.cs | 3 + .../IInstitutionContractApplication.cs | 21 +++- .../InstitutionContractApplication.cs | 18 ++- .../InstitutionContractRepository.cs | 108 +++++++++++++++++- .../institutionContractController.cs | 21 +++- 5 files changed, 164 insertions(+), 7 deletions(-) diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index dd665510..8231474f 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -57,6 +57,7 @@ public interface IInstitutionContractRepository : IRepository GetVerificationDetails(Guid id); Task GetByPublicIdAsync(Guid id); InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request); + InstitutionContractExtensionPaymentResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request); #region Extension @@ -66,6 +67,8 @@ public interface IInstitutionContractRepository : IRepository GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request); Task GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request); Task SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request); + Task ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); + Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request); #endregion diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs index f1374ff3..e369d462 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); @@ -231,6 +233,7 @@ public interface IInstitutionContractApplication Task SetDiscountForExtension( InstitutionContractSetDiscountForExtensionRequest request); + Task> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request); @@ -258,7 +261,15 @@ public interface IInstitutionContractApplication Task SetPendingWorkflow(long entityId); 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 InstitutionContractSetDiscountForExtensionRequest @@ -268,6 +279,12 @@ public class InstitutionContractSetDiscountForExtensionRequest 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 { diff --git a/CompanyManagment.Application/InstitutionContractApplication.cs b/CompanyManagment.Application/InstitutionContractApplication.cs index dec26cd1..0a249afb 100644 --- a/CompanyManagment.Application/InstitutionContractApplication.cs +++ b/CompanyManagment.Application/InstitutionContractApplication.cs @@ -1423,6 +1423,17 @@ public class InstitutionContractApplication : IInstitutionContractApplication 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); @@ -1451,7 +1462,12 @@ public class InstitutionContractApplication : IInstitutionContractApplication { 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); diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 031cef14..76c4d848 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -1915,6 +1915,50 @@ public class InstitutionContractRepository : RepositoryBase GetExtensionInquiry(long previousContractId) @@ -2269,11 +2313,71 @@ public class InstitutionContractRepository : RepositoryBase 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) diff --git a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs index 58f62148..dc243c61 100644 --- a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs +++ b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs @@ -451,8 +451,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(InstitutionContractResetDiscountForCreateRequest request) + { + var res = _institutionContractApplication.ResetDiscountCreate(request); + return res; + } /// /// /// @@ -553,6 +564,12 @@ public class institutionContractController : AdminBaseController 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) {