Add reset discount functionality for institution contract creation and extension

This commit is contained in:
2025-11-29 11:11:34 +03:30
parent 511932fa58
commit 5d81731512
5 changed files with 164 additions and 7 deletions

View File

@@ -57,6 +57,7 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request);
InstitutionContractExtensionPaymentResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
#region Extension
@@ -66,6 +67,8 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
Task<InstitutionContractExtensionPlanResponse> GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request);
Task<InstitutionContractExtensionPaymentResponse> GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request);
Task<InstitutionContractExtensionPaymentResponse> SetDiscountForExtension(InstitutionContractSetDiscountForExtensionRequest request);
Task<InstitutionContractExtensionPaymentResponse> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request);
Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request);
#endregion

View File

@@ -215,7 +215,9 @@ public interface IInstitutionContractApplication
Task<OperationResult<OtpResultViewModel>> SendVerifyOtp(Guid id);
Task<OperationResult<string>> VerifyOtpAndMakeGateway(Guid publicId, string code, string callbackUrl);
Task<InstitutionContractWorkshopDetailViewModel> GetWorkshopInitialDetails(long workshopDetailsId);
InstitutionContractExtensionPaymentResponse CalculateDiscount(InstitutionContractSetDiscountRequest request);
InstitutionContractExtensionPaymentResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
#region Extension
Task<InstitutionContractExtensionInquiryResult> GetExtensionInquiry(long previousContractId);
@@ -231,6 +233,7 @@ public interface IInstitutionContractApplication
Task<InstitutionContractExtensionPaymentResponse> SetDiscountForExtension(
InstitutionContractSetDiscountForExtensionRequest request);
Task<ActionResult<InstitutionContractExtensionPaymentResponse>> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request);
Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request);
@@ -258,7 +261,15 @@ public interface IInstitutionContractApplication
Task<OperationResult> SetPendingWorkflow(long entityId);
Task<long> 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
{

View File

@@ -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<InstitutionContractExtensionInquiryResult> GetExtensionInquiry(long previousContractId)
{
return await _institutionContractRepository.GetExtensionInquiry(previousContractId);
@@ -1451,7 +1462,12 @@ public class InstitutionContractApplication : IInstitutionContractApplication
{
return await _institutionContractRepository.SetDiscountForExtension(request);
}
public async Task<ActionResult<InstitutionContractExtensionPaymentResponse>> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request)
{
return await _institutionContractRepository.ResetDiscountForExtension(request);
}
public async Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request)
{
return await _institutionContractRepository.ExtensionComplete(request);

View File

@@ -1915,6 +1915,50 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
};
}
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<InstitutionContractExtensionInquiryResult> GetExtensionInquiry(long previousContractId)
@@ -2269,11 +2313,71 @@ public class InstitutionContractRepository : RepositoryBase<long, InstitutionCon
return new()
{
OneTime = institutionTemp.OneTimePayment,
Monthly = institutionTemp.MonthlyPayment
OneTime = res.OneTime,
Monthly = res.Monthly
};
}
public async Task<InstitutionContractExtensionPaymentResponse> 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<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request)
{
var institutionContractTemp = await _institutionExtensionTemp.Find(x => x.Id == request.TemporaryId)

View File

@@ -451,8 +451,19 @@ public class institutionContractController : AdminBaseController
return operationResult;
}
[HttpPost("create/set-discount")]
public ActionResult<InstitutionContractExtensionPaymentResponse> SetDiscountForInstitutionContract([FromBody]InstitutionContractSetDiscountRequest request)
{
var res = _institutionContractApplication.CalculateDiscount(request);
return res;
}
[HttpPost("create/reset-discount")]
public ActionResult<InstitutionContractExtensionPaymentResponse> ResetDiscountForCreate(InstitutionContractResetDiscountForCreateRequest request)
{
var res = _institutionContractApplication.ResetDiscountCreate(request);
return res;
}
/// <summary>
///
/// </summary>
@@ -553,6 +564,12 @@ public class institutionContractController : AdminBaseController
return res;
}
[HttpPost("extension/reset-discount")]
public async Task<ActionResult<InstitutionContractExtensionPaymentResponse>> ResetDiscountForExtension([FromBody]InstitutionContractResetDiscountForExtensionRequest request)
{
var res =await _institutionContractApplication.ResetDiscountForExtension(request);
return res;
}
[HttpPost("extenstion/complete")]
public async Task<ActionResult<OperationResult>> ExtensionComplete([FromBody]InstitutionContractExtensionCompleteRequest request)
{