From d2f0ed46aeb36fb6e82bce2a22712b7a4fad2ed3 Mon Sep 17 00:00:00 2001 From: mahan Date: Sat, 29 Nov 2025 20:07:29 +0330 Subject: [PATCH] Refactor discount calculation and response models for institution contracts - Replace InstitutionContractExtensionPaymentResponse with InstitutionContractDiscountResponse in discount-related methods and endpoints - Update request and response models to include OneMonthAmount, Obligation, and improved discount fields - Adjust method signatures and controller actions to use new response types - Refactor discount calculation logic to support new structure and ensure correct plan updates for both installment and one-time payments - Improve naming consistency for discount percentage fields --- .../IInstitutionContractRepository.cs | 9 +- .../CreateInstitutionContractRequest.cs | 2 +- .../IInstitutionContractApplication.cs | 50 +++- .../InstitutionContractApplication.cs | 13 +- .../InstitutionContractRepository.cs | 225 +++++++++++++++--- .../institutionContractController.cs | 8 +- 6 files changed, 253 insertions(+), 54 deletions(-) diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 8231474f..1d33e34f 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -56,8 +56,8 @@ public interface IInstitutionContractRepository : IRepository GetVerificationDetails(Guid id); Task GetByPublicIdAsync(Guid id); - InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request); - InstitutionContractExtensionPaymentResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request); + InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request); + InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request); #region Extension @@ -66,8 +66,9 @@ public interface IInstitutionContractRepository : IRepository GetExtensionWorkshops(InstitutionContractExtensionWorkshopsRequest request); Task GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request); Task GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request); - Task SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request); - Task ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); + Task SetDiscountForExtension( + InstitutionContractSetDiscountForExtensionRequest request); + Task ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request); diff --git a/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs index 9ec2c821..b3386d7a 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/CreateInstitutionContractRequest.cs @@ -87,7 +87,7 @@ public class CreateInstitutionContractRequest /// /// مبلغ کل قرارداد /// - public double TotalAmount { get; set; } + public double PaymentAmount { get; set; } /// /// آیا قرارداد اقساطی است؟ diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs index a415d897..f77efb54 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs @@ -215,8 +215,8 @@ 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); + InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request); + InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request); #region Extension @@ -231,9 +231,10 @@ public interface IInstitutionContractApplication Task GetExtensionPaymentMethod( InstitutionContractExtensionPaymentRequest request); - Task SetDiscountForExtension( - InstitutionContractSetDiscountForExtensionRequest request); - Task> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request); + Task SetDiscountForExtension( + InstitutionContractSetDiscountForExtensionRequest request); + Task ResetDiscountForExtension( + InstitutionContractResetDiscountForExtensionRequest request); Task ExtensionComplete(InstitutionContractExtensionCompleteRequest request); @@ -264,12 +265,48 @@ public interface IInstitutionContractApplication } +public class InstitutionContractDiscountResponse +{ + public InstitutionContractDiscountOneTimeViewModel OneTime { get; set; } + public InstitutionContractDiscountMonthlyViewModel Monthly { get; set; } +} + +public class InstitutionContractDiscountMonthlyViewModel:InstitutionContractDiscountOneTimeViewModel +{ + public List Installments { get; set; } +} + +public class InstitutionContractDiscountOneTimeViewModel +{ + /// + /// مجموع مبالغ + /// + public string TotalAmount { get; set; } + /// + /// ارزش افزوده + /// + public string Tax { get; set; } + /// + /// مبلغ قابل پرداخت + /// + public string PaymentAmount { get; set; } + + public string DiscountedAmount { get; set; } + + public int DiscountPercetage { get; set; } + + public string Obligation { get; set; } + + public string OneMonthAmount { get; set; } +} + public class InstitutionContractResetDiscountForCreateRequest { - public int Percentage { get; set; } + public int DiscountPercentage { get; set; } public double TotalAmount { get; set; } public bool IsInstallment { get; set; } public InstitutionContractDuration Duration { get; set; } + public double OneMonthAmount { get; set; } } public class InstitutionContractSetDiscountForExtensionRequest @@ -291,6 +328,7 @@ public class InstitutionContractSetDiscountRequest public int DiscountPercentage { get; set; } public double TotalAmount { get; set; } public InstitutionContractDuration Duration { get; set; } + public double OneMonthAmount { get; set; } public bool IsInstallment { get; set; } } diff --git a/CompanyManagment.Application/InstitutionContractApplication.cs b/CompanyManagment.Application/InstitutionContractApplication.cs index 0a249afb..2ced77de 100644 --- a/CompanyManagment.Application/InstitutionContractApplication.cs +++ b/CompanyManagment.Application/InstitutionContractApplication.cs @@ -1081,7 +1081,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication contractStartGr, contractStartGr.ToFarsi(), contractEndGr, contractEndGr.ToFarsi(), command.OneMonthAmount, command.DailyCompensation, - command.Obligation, command.TotalAmount, 0, + command.Obligation, command.PaymentAmount, 0, command.Workshops.Count.ToString(), command.Workshops.Sum(x => x.PersonnelCount).ToString(), command.Description, "NotOfficial", "JobRelation", hasValueAddedTax, @@ -1104,7 +1104,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication if (command.IsInstallment) { var installments = - CalculateInstallment(command.TotalAmount, (int)command.Duration, command.ContractStartFa, true); + CalculateInstallment(command.PaymentAmount, (int)command.Duration, command.ContractStartFa, true); // دریافت مبلغ اولین قسط @@ -1423,12 +1423,12 @@ public class InstitutionContractApplication : IInstitutionContractApplication return res; } - public InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request) + public InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request) { return _institutionContractRepository.CalculateDiscount(request); } - public InstitutionContractExtensionPaymentResponse ResetDiscountCreate( + public InstitutionContractDiscountResponse ResetDiscountCreate( InstitutionContractResetDiscountForCreateRequest request) { return _institutionContractRepository.ResetDiscountCreate(request); @@ -1457,13 +1457,14 @@ public class InstitutionContractApplication : IInstitutionContractApplication return await _institutionContractRepository.GetExtensionPaymentMethod(request); } - public async Task SetDiscountForExtension( + public async Task SetDiscountForExtension( InstitutionContractSetDiscountForExtensionRequest request) { return await _institutionContractRepository.SetDiscountForExtension(request); } - public async Task> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request) + public async Task ResetDiscountForExtension( + InstitutionContractResetDiscountForExtensionRequest request) { return await _institutionContractRepository.ResetDiscountForExtension(request); } diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 512c5e69..a06762f6 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -1870,19 +1870,21 @@ public class InstitutionContractRepository : RepositoryBase x.PublicId == id); } - public InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request) + public InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request) { var baseAmount = request.TotalAmount; var discountAmount = (baseAmount * request.DiscountPercentage) / 100; + var discountOneMonthAmount = (request.OneMonthAmount * request.DiscountPercentage) / 100; + var discountedOneMonthAmount = request.OneMonthAmount - discountOneMonthAmount; var totalAmount = baseAmount - discountAmount; var taxAmount = totalAmount * 0.10; var paymentAmount = totalAmount + taxAmount; - InstitutionContractPaymentMonthlyViewModel monthlyPayment = null; - InstitutionContractPaymentOneTimeViewModel oneTimePayment = null; + InstitutionContractDiscountMonthlyViewModel monthlyPayment = null; + InstitutionContractDiscountOneTimeViewModel oneTimePayment = null; if (request.IsInstallment) { - monthlyPayment = new InstitutionContractPaymentMonthlyViewModel() + monthlyPayment = new InstitutionContractDiscountMonthlyViewModel() { TotalAmount = totalAmount.ToMoney(), PaymentAmount = paymentAmount.ToMoney(), @@ -1890,43 +1892,49 @@ public class InstitutionContractRepository : RepositoryBase baseAmount) throw new BadRequestException("مقدار تخفیف نمی‌تواند بیشتر از مبلغ کل باشد"); - return new InstitutionContractExtensionPaymentResponse() + return new InstitutionContractDiscountResponse() { Monthly = monthlyPayment, OneTime = oneTimePayment }; } - public InstitutionContractExtensionPaymentResponse ResetDiscountCreate( + public InstitutionContractDiscountResponse ResetDiscountCreate( InstitutionContractResetDiscountForCreateRequest request) { - InstitutionContractPaymentMonthlyViewModel monthlyPayment = null; - InstitutionContractPaymentOneTimeViewModel oneTimePayment = null; + InstitutionContractDiscountMonthlyViewModel monthlyPayment = null; + InstitutionContractDiscountOneTimeViewModel oneTimePayment = null; if (request.IsInstallment) { - var newTotalAmount = request.TotalAmount / (1 - (request.Percentage / 100)); + var newTotalAmount = request.TotalAmount / (1 - (request.DiscountPercentage / 100.0)); var taxAmount = (newTotalAmount * 0.10); var paymentAmount = (newTotalAmount + taxAmount); - monthlyPayment = new InstitutionContractPaymentMonthlyViewModel() + var newOneMonthAmount = request.OneMonthAmount / (1 - (request.DiscountPercentage / 100.0)); + + monthlyPayment = new InstitutionContractDiscountMonthlyViewModel() { TotalAmount = newTotalAmount.ToMoney(), Tax = taxAmount.ToMoney(), @@ -1934,25 +1942,31 @@ public class InstitutionContractRepository : RepositoryBase SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request) + public async Task SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request) { if (request.DiscountPercentage <= 0) @@ -2288,26 +2302,96 @@ public class InstitutionContractRepository : RepositoryBase0) 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 + IsInstallment = request.IsInstallment, + OneMonthAmount = selectedPlan.OneMonthPaymentDiscounted.MoneyToDouble() + }; var res = CalculateDiscount(calculateRequest); - + //این به این دلیل هست که متد caclulate discount یکی از مقادیر رو پر میکنه و ما نیاز داریم هر دو مقدار رو داشته باشیم if (request.IsInstallment) { - res.OneTime = institutionTemp.OneTimePayment; + var onetime = institutionTemp.OneTimePayment; + 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, + }; + + selectedPlan.TotalPayment = res.Monthly.TotalAmount; + selectedPlan.Obligation = res.Monthly.Obligation; + selectedPlan.OneMonthPaymentDiscounted = res.Monthly.PaymentAmount; + selectedPlan.DailyCompenseation = (res.Monthly.OneMonthAmount.MoneyToDouble() * 0.10).ToMoney(); } else { - res.Monthly = institutionTemp.MonthlyPayment; + var monthly = institutionTemp.MonthlyPayment; + 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, + }; + selectedPlan.TotalPayment = res.OneTime.TotalAmount; + selectedPlan.Obligation = res.OneTime.Obligation; + selectedPlan.OneMonthPaymentDiscounted = res.OneTime.PaymentAmount; + 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(); + } - institutionTemp.SetAmountAndDuration(institutionTemp.Duration.Value, res.Monthly, res.OneTime); await _institutionExtensionTemp.ReplaceOneAsync(x => x.Id == institutionTemp.Id, institutionTemp); @@ -2318,7 +2402,7 @@ public class InstitutionContractRepository : RepositoryBase ResetDiscountForExtension + public async Task ResetDiscountForExtension (InstitutionContractResetDiscountForExtensionRequest request) { var institutionTemp = await _institutionExtensionTemp.Find(x => x.Id == request.TempId) @@ -2328,8 +2412,16 @@ public class InstitutionContractRepository : RepositoryBase institutionTemp.OneMonth, + InstitutionContractDuration.ThreeMonths => institutionTemp.ThreeMonths, + InstitutionContractDuration.SixMonths => institutionTemp.SixMonths, + InstitutionContractDuration.TwelveMonths => institutionTemp.TwelveMonths, + _ => throw new ArgumentOutOfRangeException() + }; if (request.IsInstallment) { var prevMonthlyPayment = institutionTemp.MonthlyPayment; @@ -2337,7 +2429,8 @@ public class InstitutionContractRepository : RepositoryBasex.Id == institutionTemp.Id, institutionTemp); @@ -2358,20 +2484,53 @@ public class InstitutionContractRepository : RepositoryBasex.Id == institutionTemp.Id, institutionTemp); } - return new() + return new InstitutionContractDiscountResponse() { OneTime = oneTimePayment, Monthly = monthlyPayment diff --git a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs index 7d8b1039..fd7130fd 100644 --- a/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs +++ b/ServiceHost/Areas/Admin/Controllers/institutionContractController.cs @@ -452,14 +452,14 @@ public class institutionContractController : AdminBaseController return operationResult; } [HttpPost("create/set-discount")] - public ActionResult SetDiscountForInstitutionContract([FromBody]InstitutionContractSetDiscountRequest request) + public ActionResult SetDiscountForInstitutionContract([FromBody]InstitutionContractSetDiscountRequest request) { var res = _institutionContractApplication.CalculateDiscount(request); return res; } [HttpPost("create/reset-discount")] - public ActionResult ResetDiscountForCreate([FromBody]InstitutionContractResetDiscountForCreateRequest request) + public ActionResult ResetDiscountForCreate([FromBody]InstitutionContractResetDiscountForCreateRequest request) { var res = _institutionContractApplication.ResetDiscountCreate(request); return res; @@ -558,14 +558,14 @@ public class institutionContractController : AdminBaseController } [HttpPost("extension/set-discount")] - public async Task> SetDiscountForExtension([FromBody]InstitutionContractSetDiscountForExtensionRequest request) + 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) + public async Task> ResetDiscountForExtension([FromBody]InstitutionContractResetDiscountForExtensionRequest request) { var res =await _institutionContractApplication.ResetDiscountForExtension(request); return res;