986 lines
38 KiB
C#
986 lines
38 KiB
C#
using System.Collections.Concurrent;
|
||
using System.Transactions;
|
||
using _0_Framework.Application;
|
||
using _0_Framework.Application.Enums;
|
||
using _0_Framework.Application.PaymentGateway;
|
||
using _0_Framework.Application.Sms;
|
||
using _0_Framework.Exceptions;
|
||
using AccountManagement.Application.Contracts.Account;
|
||
using Company.Domain.TemporaryClientRegistrationAgg;
|
||
using CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
||
using CompanyManagment.App.Contracts.Employer;
|
||
using CompanyManagment.App.Contracts.InstitutionContract;
|
||
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
||
using CompanyManagment.App.Contracts.InstitutionPlan;
|
||
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
||
using CompanyManagment.App.Contracts.Representative;
|
||
using CompanyManagment.App.Contracts.TemporaryClientRegistration;
|
||
using CompanyManagment.App.Contracts.Workshop;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
|
||
using ServiceHost.Areas.Client.Pages.Company.PaymentToEmployee;
|
||
using ServiceHost.BaseControllers;
|
||
|
||
namespace ServiceHost.Areas.Admin.Controllers;
|
||
|
||
/// <summary>
|
||
/// کنترلر قرارداد های مالی موسسه
|
||
/// </summary>
|
||
public class institutionContractController : AdminBaseController
|
||
{
|
||
private readonly IInstitutionContractApplication _institutionContractApplication;
|
||
private readonly IPersonalContractingPartyApp _contractingPartyApplication;
|
||
private readonly IContactInfoApplication _contactInfoApplication;
|
||
private readonly IAccountApplication _accountApplication;
|
||
private readonly IEmployerApplication _employerApplication;
|
||
private readonly IWorkshopApplication _workshopApplication;
|
||
private readonly ITemporaryClientRegistrationApplication _temporaryClientRegistration;
|
||
private readonly ITemporaryClientRegistrationApplication _clientRegistrationApplication;
|
||
private readonly IPaymentGateway _paymentGateway;
|
||
|
||
private static readonly ConcurrentDictionary<Guid, SemaphoreSlim> _locks
|
||
= new ConcurrentDictionary<Guid, SemaphoreSlim>();
|
||
|
||
|
||
public institutionContractController(IInstitutionContractApplication institutionContractApplication,
|
||
IPersonalContractingPartyApp contractingPartyApplication, IContactInfoApplication contactInfoApplication,
|
||
IAccountApplication accountApplication, IEmployerApplication employerApplication,
|
||
IWorkshopApplication workshopApplication, ITemporaryClientRegistrationApplication temporaryClientRegistration,
|
||
ITemporaryClientRegistrationApplication clientRegistrationApplication, IHttpClientFactory httpClientFactory)
|
||
{
|
||
_institutionContractApplication = institutionContractApplication;
|
||
_contractingPartyApplication = contractingPartyApplication;
|
||
_contactInfoApplication = contactInfoApplication;
|
||
_accountApplication = accountApplication;
|
||
_employerApplication = employerApplication;
|
||
_workshopApplication = workshopApplication;
|
||
_temporaryClientRegistration = temporaryClientRegistration;
|
||
_clientRegistrationApplication = clientRegistrationApplication;
|
||
_paymentGateway = new SepehrPaymentGateway(httpClientFactory);
|
||
}
|
||
|
||
/// <summary>
|
||
/// لیست قرارداد های مالی
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet]
|
||
public async Task<ActionResult<PagedResult<GetInstitutionContractListItemsViewModel>>> GetList(
|
||
InstitutionContractListSearchModel searchModel)
|
||
{
|
||
return await _institutionContractApplication.GetList(searchModel);
|
||
}
|
||
|
||
[HttpGet("select-list")]
|
||
public async Task<ActionResult<List<InstitutionContractSelectListViewModel>>> GetContractingPartySelectList(
|
||
string search, string selected)
|
||
{
|
||
var result = await _institutionContractApplication
|
||
.GetInstitutionContractSelectList(search, selected);
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// وضعیت تب ها
|
||
/// </summary>
|
||
/// <param name="searchModel"></param>
|
||
/// <returns></returns>
|
||
[HttpGet("stats")]
|
||
public async Task<ActionResult<GetInstitutionContractListStatsViewModel>> GetListStats(
|
||
InstitutionContractListSearchModel searchModel)
|
||
{
|
||
return await _institutionContractApplication.GetListStats(searchModel);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// ویرایش
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPut]
|
||
public async Task<ActionResult<OperationResult>> Edit([FromBody] EditInstitutionContractRequest command)
|
||
{
|
||
var op = new OperationResult();
|
||
var phoneNumber = command.ContactInfos.FirstOrDefault(x =>
|
||
x.SendSmsString == "true" && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه");
|
||
var conractingParty = _contractingPartyApplication.GetDetails(command.ContractingPartyId);
|
||
|
||
if (conractingParty.IsLegal == "حقیقی" && string.IsNullOrWhiteSpace(conractingParty.Nationalcode))
|
||
return new JsonResult(op.Failed("کد ملی طرف حساب وجود ندارد"));
|
||
if (conractingParty.IsLegal == "حقوقی" && string.IsNullOrWhiteSpace(conractingParty.NationalId))
|
||
return new JsonResult(op.Failed("شناسه ملی طرف حساب وجود ندارد"));
|
||
if (phoneNumber == null)
|
||
return new JsonResult(op.Failed("تعیین شماره همراه با سمت طرف قرارداد اجباریست"));
|
||
//if (string.IsNullOrWhiteSpace(command.HasValueAddedTax))
|
||
// command.HasValueAddedTax = "false";
|
||
var result = await _institutionContractApplication.EditAsync(command);
|
||
var contractingPartyId = _institutionContractApplication.GetDetails(result.SendId);
|
||
var counter = command.ContactInfos.Count;
|
||
var getOldContarct = _institutionContractApplication.NewSearch(new InstitutionContractSearchModel()
|
||
{ ContractingPartyId = contractingPartyId.ContractingPartyId, IsActiveString = "both" })
|
||
.Where(x => x.IsActiveString == "false" || x.IsActiveString == "blue").ToList();
|
||
if (result.IsSuccedded && counter > 0)
|
||
{
|
||
if (getOldContarct.Count > 0)
|
||
{
|
||
foreach (var item in getOldContarct)
|
||
{
|
||
_contactInfoApplication.RemoveContactInfo(item.Id);
|
||
foreach (var phone in command.ContactInfos)
|
||
{
|
||
if (phone.PhoneNumber != null)
|
||
{
|
||
var contactinfo = new CreateContactInfo
|
||
{
|
||
InstitutionContractId = item.Id,
|
||
PhoneType = phone.PhoneType,
|
||
Position = phone.Position,
|
||
PhoneNumber = phone.PhoneNumber,
|
||
FnameLname = phone.FnameLname,
|
||
SendSms = phone.SendSmsString == "true" ? true : false
|
||
};
|
||
_contactInfoApplication.Create(contactinfo);
|
||
}
|
||
|
||
Thread.Sleep(500);
|
||
}
|
||
}
|
||
}
|
||
|
||
_contactInfoApplication.RemoveContactInfo(command.Id);
|
||
foreach (var item in command.ContactInfos)
|
||
{
|
||
if (item.PhoneNumber != null)
|
||
{
|
||
var contactinfo = new CreateContactInfo
|
||
{
|
||
InstitutionContractId = result.SendId,
|
||
PhoneType = item.PhoneType,
|
||
Position = item.Position,
|
||
PhoneNumber = item.PhoneNumber,
|
||
FnameLname = item.FnameLname,
|
||
SendSms = item.SendSmsString == "true" ? true : false
|
||
};
|
||
_contactInfoApplication.Create(contactinfo);
|
||
}
|
||
|
||
Thread.Sleep(500);
|
||
}
|
||
|
||
|
||
//ساخت اکانت کلاینت
|
||
var userPass = conractingParty.IsLegal == "حقیقی"
|
||
? conractingParty.Nationalcode
|
||
: conractingParty.NationalId;
|
||
var checkExistAccount = _accountApplication.CheckExistClientAccount(userPass);
|
||
if (!checkExistAccount)
|
||
{
|
||
var createAcc = new RegisterAccount
|
||
{
|
||
Fullname = conractingParty.LName,
|
||
Username = userPass,
|
||
Password = userPass,
|
||
Mobile = phoneNumber.PhoneNumber,
|
||
NationalCode = userPass
|
||
};
|
||
var res = _accountApplication.RegisterClient(createAcc);
|
||
if (res.IsSuccedded)
|
||
_institutionContractApplication.CreateContractingPartyAccount(command.ContractingPartyId,
|
||
res.SendId);
|
||
}
|
||
}
|
||
//Thread.Sleep(500);
|
||
//for (int i = 0; i <= counter - 1; i++)
|
||
//{
|
||
// if (command.ContactInformationList[i].PhoneNumber != null)
|
||
// {
|
||
|
||
// var contactinfo = new CreateContactInfo()
|
||
// {
|
||
// InstitutionContractId = result.SendId,
|
||
// PhoneType = command.ContactInformationList[i].PhoneType,
|
||
// Position = command.ContactInformationList[i].Position,
|
||
// PhoneNumber = command.ContactInformationList[i].PhoneNumber,
|
||
// FnameLname = command.ContactInformationList[i].FnameLname,
|
||
// SendSms = command.ContactInformationList[i].SendSmsString == "true" ? true : false
|
||
// };
|
||
// _contactInfoApplication.Create(contactinfo);
|
||
|
||
// }
|
||
// Thread.Sleep(500);
|
||
//}
|
||
|
||
|
||
return new JsonResult(result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// حذف قرارداد مالی
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[HttpDelete("{id}")]
|
||
public async Task<ActionResult<OperationResult>> Remove(long id)
|
||
{
|
||
_institutionContractApplication.RemoveContract(id);
|
||
return new OperationResult().Succcedded();
|
||
}
|
||
|
||
[HttpPost("deActive/{id}")]
|
||
public ActionResult<OperationResult> DeActive(long id, string balance)
|
||
{
|
||
var result = new OperationResult();
|
||
if (balance == "0")
|
||
{
|
||
result = _institutionContractApplication.DeActive(id);
|
||
if (result.IsSuccedded) result = _institutionContractApplication.DeActiveAllConnections(id);
|
||
}
|
||
else
|
||
{
|
||
result = _institutionContractApplication.DeActiveBlue(id);
|
||
if (result.IsSuccedded)
|
||
result = _institutionContractApplication.DeActiveAllConnections(id);
|
||
}
|
||
|
||
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// غیر فعال
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[HttpPost("active/{id}")]
|
||
public ActionResult<OperationResult> IsActive(long id)
|
||
{
|
||
var result = _institutionContractApplication.Active(id);
|
||
if (result.IsSuccedded)
|
||
{
|
||
result = _institutionContractApplication.ReActiveAllConnections(id);
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
[HttpPost("sign/{id}")]
|
||
public ActionResult<OperationResult> Sign(long Id)
|
||
{
|
||
var result = _institutionContractApplication.Sign(Id);
|
||
if (result.IsSuccedded)
|
||
return new JsonResult(new
|
||
{
|
||
isSuccedded = true
|
||
});
|
||
return new JsonResult(new
|
||
{
|
||
isSuccedded = false
|
||
});
|
||
}
|
||
|
||
[HttpPost("unsign/{id}")]
|
||
public ActionResult<OperationResult> UnSign(long Id)
|
||
{
|
||
var id = Convert.ToInt64(Id);
|
||
var result = _institutionContractApplication.UnSign(Id);
|
||
if (result.IsSuccedded)
|
||
return new JsonResult(new
|
||
{
|
||
isSuccedded = true
|
||
});
|
||
return new JsonResult(new
|
||
{
|
||
isSuccedded = false
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// بلاک طرف حساب
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[HttpPost("block-contracting-party/{id}")]
|
||
public IActionResult OnPostBlockContractingParty(long id)
|
||
{
|
||
var result = _contractingPartyApplication.Block(id);
|
||
var afterActtion = _contractingPartyApplication.GetDetails(id);
|
||
return new JsonResult(new
|
||
{
|
||
isSuccedded = result.IsSuccedded,
|
||
isBlock = afterActtion.IsBlock,
|
||
blockTimes = afterActtion.BlockTimes
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// آنبلاک طرف حساب
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[HttpPost("unblock-contracting-party/{id}")]
|
||
public IActionResult OnPostUnBlockContractingParty(long id)
|
||
{
|
||
var result = _contractingPartyApplication.DisableBlock(id);
|
||
var afterActtion = _contractingPartyApplication.GetDetails(id);
|
||
return new JsonResult(new
|
||
{
|
||
isSuccedded = result.IsSuccedded,
|
||
isBlock = afterActtion.IsBlock,
|
||
blockTimes = afterActtion.BlockTimes
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// دانلود اکسل
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet("excel")]
|
||
public IActionResult OnGetDownloadExcel()
|
||
{
|
||
var institutionContractViewModels =
|
||
_institutionContractApplication.NewSearch(new() { IsActiveString = "both", TypeOfContract = "both" });
|
||
var bytes = InstitutionContractExcelGenerator.GenerateExcel(new List<InstitutionContractExcelViewModel>());
|
||
return File(bytes,
|
||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||
$"قرارداد های مالی.xlsx");
|
||
}
|
||
|
||
[HttpPost("create/inquiry")]
|
||
public async Task<ActionResult<OperationResult<ContractingPartyTempViewModel>>> CreateInquiry(
|
||
[FromBody] InstitutionContractCreationInquiryRequest request)
|
||
{
|
||
var res = await _temporaryClientRegistration.CreateContractingPartyTemp(request.NationalCode,
|
||
request.DateOfBirth,
|
||
request.Mobile);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("workshop-service-calculator")]
|
||
public ActionResult<WorkshopServiceCalculatorResponse> WorkshopServiceCalculator(
|
||
[FromBody] CreateWorkshopTemp command)
|
||
{
|
||
var workshopTemp = new WorkshopTempViewModel
|
||
{
|
||
WorkshopName = command.WorkshopName,
|
||
CountPerson = command.CountPerson,
|
||
ContractAndCheckout = command.ContractAndCheckout,
|
||
Insurance = command.Insurance,
|
||
RollCall = command.RollCall,
|
||
CustomizeCheckout = command.CustomizeCheckout,
|
||
ContractAndCheckoutInPerson = command.ContractAndCheckoutInPerson,
|
||
InsuranceInPerson = command.InsuranceInPerson
|
||
};
|
||
|
||
var response = _temporaryClientRegistration.GetInstitutionPlanForWorkshop(workshopTemp);
|
||
|
||
var result = new WorkshopServiceCalculatorResponse
|
||
{
|
||
TotalAmount = response.OnlineAndInPersonSumAmountStr
|
||
};
|
||
return result;
|
||
}
|
||
|
||
[HttpPost("create/institution-plan-calculator")]
|
||
public async Task<ActionResult<InstitutionPlanCalculatorResponse>> InstitutionPlanCalculator(
|
||
[FromBody] InstitutionPlanCalculatorRequest request)
|
||
{
|
||
var res = await _temporaryClientRegistration.GetTotalPaymentAndWorkshopList(request.TotalAmountMonth,
|
||
duration: request.Duration, request.HasInPersonContract);
|
||
var result = new InstitutionPlanCalculatorResponse()
|
||
{
|
||
TotalAmountWithTax = res.OneTimeTotalPaymentStr,
|
||
OneTimeTotalAmountWithoutTax = res.OneTimeWithoutTaxPaymentStr,
|
||
OneTimeValueAddedTaxStr = res.OneTimeValueAddedTaxStr,
|
||
Installments = res.MonthlyInstallments,
|
||
OneTimeTotalAmount = res.OneTimeTotalPaymentStr,
|
||
MonthlyTotalAmount = res.MonthlyTotalPaymentStr,
|
||
MonthlyTotalAmountWithoutTax = res.MonthlyWithoutTaxPaymentStr,
|
||
ContractStart = res.ContractStartFa,
|
||
ContractEnd = res.ContractEndFa,
|
||
Discount = res.Discount,
|
||
MonthlyValueAddedTaxStr = res.MonthlyValueAddedTaxStr,
|
||
DailyCompensation = res.DailyCompensation,
|
||
Obligation = res.OneTimeTotalPaymentStr,
|
||
PaymentForOneMonth = res.SumOfWorkshopsPayment,
|
||
DiscountedAmountForOneMonth = res.DiscountedAmountForOneMonth
|
||
};
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// ایجاد
|
||
/// </summary>
|
||
/// <param name="command"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<ActionResult<OperationResult>> Create([FromBody] CreateInstitutionContractRequest command)
|
||
{
|
||
var res = await _institutionContractApplication.CreateAsync(command);
|
||
|
||
if (!res.IsSuccedded)
|
||
throw new BadRequestException(res.Message);
|
||
|
||
return res;
|
||
}
|
||
|
||
/// <summary>
|
||
/// ارسال لینک تایید قوانین و مقررات به طرف حساب
|
||
/// </summary>
|
||
/// <param name="contractingPartyTempId"></param>
|
||
/// <returns></returns>
|
||
[HttpPost("create/send-link/{contractingPartyTempId}")]
|
||
public async Task<ActionResult<OperationResult>> SendAgreementLink(long contractingPartyTempId)
|
||
{
|
||
return await _temporaryClientRegistration.SendAgreementLink(contractingPartyTempId);
|
||
}
|
||
|
||
[HttpPost("create/verify-code")]
|
||
public async Task<ActionResult<OperationResult>> CheckVerifyCode(VerifyCodeRequest request)
|
||
{
|
||
using var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
|
||
var operationResult =
|
||
await _clientRegistrationApplication.CheckVerifyCodeIsTrue(request.ContractingPartyId, request.verifyCode);
|
||
if (!operationResult.IsSuccedded)
|
||
return operationResult;
|
||
|
||
operationResult = await _temporaryClientRegistration.PayOffCompleted(request.ContractingPartyId);
|
||
|
||
if (operationResult.IsSuccedded)
|
||
transaction.Complete();
|
||
|
||
return operationResult;
|
||
}
|
||
|
||
[HttpPost("create/set-discount")]
|
||
public ActionResult<InstitutionContractDiscountResponse> SetDiscountForInstitutionContract(
|
||
[FromBody] InstitutionContractSetDiscountRequest request)
|
||
{
|
||
var res = _institutionContractApplication.CalculateDiscount(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("create/reset-discount")]
|
||
public ActionResult<InstitutionContractDiscountResponse> ResetDiscountForCreate(
|
||
[FromBody] InstitutionContractResetDiscountForCreateRequest request)
|
||
{
|
||
var res = _institutionContractApplication.ResetDiscountCreate(request);
|
||
return res;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[HttpGet("/api/institutionContract/Verification/{id:guid}")]
|
||
[AllowAnonymous]
|
||
public async Task<ActionResult<GetInstitutionVerificationDetailsViewModel>> GetVerificationDetails(Guid id)
|
||
{
|
||
return await _institutionContractApplication.GetVerificationDetails(id);
|
||
}
|
||
|
||
[HttpPost("/api/institutionContract/Verify")]
|
||
[AllowAnonymous]
|
||
public async Task<ActionResult<OperationResult<string>>> Verify([FromBody] InstitutionVerificationRequest command)
|
||
{
|
||
// URL برای redirect به درگاه پرداخت
|
||
var paymentRedirectUrl = Url.Action("ProcessPayment", "institutionContract", null, Request.Scheme);
|
||
var callback = Url.Action("Verify", "General", null, Request.Scheme);
|
||
var res = await _institutionContractApplication.VerifyOtpAndMakeGateway(command.Id, command.Code, callback);
|
||
|
||
if (!res.IsSuccedded)
|
||
return new OperationResult<string>().Failed(res.Message);
|
||
|
||
var payUrl = _paymentGateway.GetStartPayUrl(res.Data);
|
||
|
||
// URL کامل برای redirect شامل paymentUrl به عنوان query parameter
|
||
var redirectUrl = $"{paymentRedirectUrl}?paymentUrl={Uri.EscapeDataString(payUrl)}";
|
||
|
||
return new OperationResult<string>().Succcedded(redirectUrl);
|
||
}
|
||
|
||
[HttpGet("/api/institutionContract/ProcessPayment")]
|
||
[AllowAnonymous]
|
||
public IActionResult ProcessPayment([FromQuery] string paymentUrl)
|
||
{
|
||
if (string.IsNullOrEmpty(paymentUrl))
|
||
{
|
||
return BadRequest("Payment URL is required");
|
||
}
|
||
|
||
// redirect به درگاه پرداخت
|
||
return Redirect(paymentUrl);
|
||
}
|
||
|
||
|
||
[HttpPost("/api/institutionContract/Verification/{id:guid}/send-otp")]
|
||
[AllowAnonymous]
|
||
public async Task<ActionResult<OperationResult<OtpResultViewModel>>> SendVerifyOtp(Guid id)
|
||
{
|
||
var sem = _locks.GetOrAdd(id, _ => new SemaphoreSlim(1, 1));
|
||
await sem.WaitAsync();
|
||
try
|
||
{
|
||
var res = await _institutionContractApplication.SendVerifyOtp(id);
|
||
return res;
|
||
}
|
||
finally
|
||
{
|
||
sem.Release();
|
||
}
|
||
}
|
||
|
||
#region Create
|
||
|
||
[HttpPost("creation/inquiry/")]
|
||
public async Task<ActionResult<InstitutionContractCreationInquiryResult>> CreationInquiry(
|
||
InstitutionContractCreationInquiryRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.CreationInquiry(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpGet("creation/get-representative")]
|
||
public async Task<ActionResult<InstitutionContractCreationGetRepresentativeIdResponse>> GetRepresentatives(
|
||
string nationalCode)
|
||
{
|
||
var res = await _contractingPartyApplication.GetRepresentativeIdByNationalCode(nationalCode);
|
||
return new InstitutionContractCreationGetRepresentativeIdResponse()
|
||
{
|
||
RepresentativeId = res
|
||
};
|
||
}
|
||
|
||
[HttpPost("creation/workshops")]
|
||
public async Task<ActionResult<InstitutionContractCreationWorkshopsResponse>> CreationWorkshops(
|
||
[FromBody] InstitutionContractCreationWorkshopsRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetCreationWorkshops(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("creation/institution-plan")]
|
||
public async Task<ActionResult<InstitutionContractCreationPlanResponse>> CreationInstitutionPlan(
|
||
[FromBody] InstitutionContractCreationPlanRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetCreationInstitutionPlan(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("creation/payment-method")]
|
||
public async Task<ActionResult<InstitutionContractCreationPaymentResponse>> GetCreationPaymentMethod(
|
||
[FromBody] InstitutionContractCreationPaymentRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetCreationPaymentMethod(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("creation/set-discount")]
|
||
public async Task<ActionResult<InstitutionContractDiscountResponse>> SetDiscountForCreation(
|
||
[FromBody] InstitutionContractSetDiscountForCreationRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.SetDiscountForCreation(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("creation/reset-discount")]
|
||
public async Task<ActionResult<InstitutionContractDiscountResponse>> ResetDiscountForCreation(
|
||
[FromBody] InstitutionContractResetDiscountForExtensionRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.ResetDiscountForCreation(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("creation/complete")]
|
||
public async Task<ActionResult<OperationResult>> CreationComplete(
|
||
[FromBody] InstitutionContractExtensionCompleteRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.CreationComplete(request);
|
||
return res;
|
||
}
|
||
|
||
#endregion
|
||
|
||
[HttpGet("extenstion/inquiry/{previousContractId}")]
|
||
public async Task<ActionResult<InstitutionContractExtensionInquiryResult>> ExtensionInquiry(long previousContractId)
|
||
{
|
||
var res = await _institutionContractApplication.GetExtensionInquiry(previousContractId);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("extenstion/workshops")]
|
||
public async Task<ActionResult<InstitutionContractExtensionWorkshopsResponse>> ExtensionWorkshops(
|
||
[FromBody] InstitutionContractExtensionWorkshopsRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetExtensionWorkshops(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("extenstion/institution-plan")]
|
||
public async Task<ActionResult<InstitutionContractExtensionPlanResponse>> ExtensionInstitutionPlan(
|
||
[FromBody] InstitutionContractExtensionPlanRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetExtensionInstitutionPlan(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("extenstion/payment-method")]
|
||
public async Task<ActionResult<InstitutionContractExtensionPaymentResponse>> GetExtensionPaymentMethod(
|
||
[FromBody] InstitutionContractExtensionPaymentRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetExtensionPaymentMethod(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("extension/set-discount")]
|
||
public async Task<ActionResult<InstitutionContractDiscountResponse>> SetDiscountForExtension(
|
||
[FromBody] InstitutionContractSetDiscountForExtensionRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.SetDiscountForExtension(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("extension/reset-discount")]
|
||
public async Task<ActionResult<InstitutionContractDiscountResponse>> ResetDiscountForExtension(
|
||
[FromBody] InstitutionContractResetDiscountForExtensionRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.ResetDiscountForExtension(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("extenstion/complete")]
|
||
public async Task<ActionResult<OperationResult>> ExtensionComplete(
|
||
[FromBody] InstitutionContractExtensionCompleteRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.ExtensionComplete(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpGet("amendment/workshops/{institutionContractId}")]
|
||
public async Task<ActionResult<InstitutionContractAmendmentWorkshopsResponse>> GetAmendmentWorkshops(
|
||
long institutionContractId)
|
||
{
|
||
var res = await _institutionContractApplication.GetAmendmentWorkshops(institutionContractId);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("resend-verify-link/{institutionContractId}")]
|
||
public async Task<OperationResult> ResendVerifyLink(long institutionContractId)
|
||
{
|
||
var res = await _institutionContractApplication.ResendVerifyLink(institutionContractId);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("amendment/insert-temp-workshops")]
|
||
public async Task<ActionResult<InsertAmendmentTempWorkshopResponse>> InsertAmendmentTempWorkshops(
|
||
[FromBody] InstitutionContractAmendmentTempWorkshopViewModel request)
|
||
{
|
||
var res = await _institutionContractApplication.InsertAmendmentTempWorkshops(request);
|
||
return res;
|
||
}
|
||
|
||
[HttpDelete("amendment/remove-temp-workshops/{workshopTempId:guid}")]
|
||
public async Task<ActionResult> RemoveAmendmentWorkshops(Guid workshopTempId)
|
||
{
|
||
await _institutionContractApplication.RemoveAmendmentWorkshops(workshopTempId);
|
||
return Ok();
|
||
}
|
||
|
||
[HttpPost("amendment/payment-details")]
|
||
public async Task<ActionResult<InsitutionContractAmendmentPaymentResponse>> GetAmendmentPaymentDetails(
|
||
[FromBody] InsitutionContractAmendmentPaymentRequest request)
|
||
{
|
||
var res = await _institutionContractApplication.GetAmendmentPaymentDetails(request);
|
||
return res;
|
||
}
|
||
|
||
|
||
[HttpGet("edit-old/{id}")]
|
||
public ActionResult<EditInstitutionContract> GetEditOldDetails(long id)
|
||
{
|
||
var representativList = new List<RepresentativeViewModel>();
|
||
var contractingPartyList = new List<PersonalContractingPartyViewModel>();
|
||
var res = _institutionContractApplication.GetDetails(id);
|
||
|
||
var representative = new RepresentativeViewModel
|
||
{
|
||
Id = res.RepresentativeId,
|
||
FullName = res.RepresentativeName
|
||
};
|
||
representativList.Add(representative);
|
||
var contractingParty = new PersonalContractingPartyViewModel
|
||
{
|
||
id = res.ContractingPartyId,
|
||
FullName = _contractingPartyApplication.GetFullName(res.ContractingPartyId)
|
||
};
|
||
contractingPartyList.Add(contractingParty);
|
||
res.RepresentativeSelectList =
|
||
new SelectList(representativList, "Id", "FullName");
|
||
res.ContractingPartiesSelectList =
|
||
new SelectList(contractingPartyList, "id", "FullName");
|
||
|
||
var employer = _employerApplication.GetEmployerByContracrtingPartyID(res.ContractingPartyId);
|
||
var emplId = employer.Select(x => x.Id).ToList();
|
||
|
||
var w = _workshopApplication.GetWorkshopsByEmployerId(emplId);
|
||
var workshopIds = w.Select(x => x.Id).ToList();
|
||
var workshopCount = Convert.ToString(w.Count);
|
||
var pCount = 0;
|
||
if (workshopIds.Count > 0)
|
||
{
|
||
foreach (var workshopId in workshopIds)
|
||
{
|
||
var p = _workshopApplication.PersonnelCount(workshopId);
|
||
pCount += p;
|
||
}
|
||
|
||
res.EmployeeCount = Convert.ToString(pCount);
|
||
}
|
||
else
|
||
{
|
||
res.EmployeeCount = "0";
|
||
}
|
||
|
||
res.WorkshopCount = workshopCount;
|
||
|
||
|
||
var contactInfo = _contactInfoApplication.GetContactInfolist(id);
|
||
if (contactInfo.Count > 0)
|
||
{
|
||
res.ContactInfoCounter = contactInfo.Count;
|
||
res.ContactInformationList = contactInfo;
|
||
}
|
||
else
|
||
{
|
||
res.ContactInfoCounter = 0;
|
||
}
|
||
|
||
if (res.HasValueAddedTax == "true")
|
||
{
|
||
res.ContractAmount -= res.ValueAddedTax;
|
||
res.ContractAmountOAlone = res.ContractAmount.ToMoney();
|
||
res.ValueAddedTaxStr = res.ValueAddedTax.ToMoney();
|
||
}
|
||
else
|
||
{
|
||
res.ContractAmountOAlone = res.ContractAmountString;
|
||
res.ValueAddedTaxStr = "0";
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("edit-old")]
|
||
public ActionResult<OperationResult> EditOld([FromBody] EditInstitutionContract command)
|
||
{
|
||
var op = new OperationResult();
|
||
var phoneNumber = command.ContactInformationList.FirstOrDefault(x =>
|
||
x.SendSmsString == "true" && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه");
|
||
var conractingParty = _contractingPartyApplication.GetDetails(command.ContractingPartyId);
|
||
|
||
if (conractingParty.IsLegal == "حقیقی" && string.IsNullOrWhiteSpace(conractingParty.Nationalcode))
|
||
return new JsonResult(op.Failed("کد ملی طرف حساب وجود ندارد"));
|
||
if (conractingParty.IsLegal == "حقوقی" && string.IsNullOrWhiteSpace(conractingParty.NationalId))
|
||
return new JsonResult(op.Failed("شناسه ملی طرف حساب وجود ندارد"));
|
||
if (phoneNumber == null)
|
||
return new JsonResult(op.Failed("تعیین شماره همراه با سمت طرف قرارداد اجباریست"));
|
||
//if (string.IsNullOrWhiteSpace(command.HasValueAddedTax))
|
||
// command.HasValueAddedTax = "false";
|
||
var result = _institutionContractApplication.Edit(command);
|
||
var contractingPartyId = _institutionContractApplication.GetDetails(result.SendId);
|
||
var counter = command.ContactInformationList.Count;
|
||
var getOldContarct = _institutionContractApplication.NewSearch(new InstitutionContractSearchModel()
|
||
{ ContractingPartyId = contractingPartyId.ContractingPartyId, IsActiveString = "both" })
|
||
.Where(x => x.IsActiveString == "false" || x.IsActiveString == "blue").ToList();
|
||
if (result.IsSuccedded && counter > 0)
|
||
{
|
||
if (getOldContarct.Count > 0)
|
||
{
|
||
foreach (var item in getOldContarct)
|
||
{
|
||
_contactInfoApplication.RemoveContactInfo(item.Id);
|
||
foreach (var phone in command.ContactInformationList)
|
||
{
|
||
if (phone.PhoneNumber != null)
|
||
{
|
||
var contactinfo = new CreateContactInfo
|
||
{
|
||
InstitutionContractId = item.Id,
|
||
PhoneType = phone.PhoneType,
|
||
Position = phone.Position,
|
||
PhoneNumber = phone.PhoneNumber,
|
||
FnameLname = phone.FnameLname,
|
||
SendSms = phone.SendSmsString == "true" ? true : false
|
||
};
|
||
_contactInfoApplication.Create(contactinfo);
|
||
}
|
||
|
||
Thread.Sleep(500);
|
||
}
|
||
}
|
||
}
|
||
|
||
_contactInfoApplication.RemoveContactInfo(command.Id);
|
||
foreach (var item in command.ContactInformationList)
|
||
{
|
||
if (item.PhoneNumber != null)
|
||
{
|
||
var contactinfo = new CreateContactInfo
|
||
{
|
||
InstitutionContractId = result.SendId,
|
||
PhoneType = item.PhoneType,
|
||
Position = item.Position,
|
||
PhoneNumber = item.PhoneNumber,
|
||
FnameLname = item.FnameLname,
|
||
SendSms = item.SendSmsString == "true" ? true : false
|
||
};
|
||
_contactInfoApplication.Create(contactinfo);
|
||
}
|
||
|
||
Thread.Sleep(500);
|
||
}
|
||
|
||
|
||
//ساخت اکانت کلاینت
|
||
var userPass = conractingParty.IsLegal == "حقیقی"
|
||
? conractingParty.Nationalcode
|
||
: conractingParty.NationalId;
|
||
var checkExistAccount = _accountApplication.CheckExistClientAccount(userPass);
|
||
if (!checkExistAccount)
|
||
{
|
||
var createAcc = new RegisterAccount
|
||
{
|
||
Fullname = conractingParty.LName,
|
||
Username = userPass,
|
||
Password = userPass,
|
||
Mobile = phoneNumber.PhoneNumber,
|
||
NationalCode = userPass
|
||
};
|
||
var res = _accountApplication.RegisterClient(createAcc);
|
||
if (res.IsSuccedded)
|
||
_institutionContractApplication.CreateContractingPartyAccount(command.ContractingPartyId,
|
||
res.SendId);
|
||
}
|
||
}
|
||
//Thread.Sleep(500);
|
||
//for (int i = 0; i <= counter - 1; i++)
|
||
//{
|
||
// if (command.ContactInformationList[i].PhoneNumber != null)
|
||
// {
|
||
|
||
// var contactinfo = new CreateContactInfo()
|
||
// {
|
||
// InstitutionContractId = result.SendId,
|
||
// PhoneType = command.ContactInformationList[i].PhoneType,
|
||
// Position = command.ContactInformationList[i].Position,
|
||
// PhoneNumber = command.ContactInformationList[i].PhoneNumber,
|
||
// FnameLname = command.ContactInformationList[i].FnameLname,
|
||
// SendSms = command.ContactInformationList[i].SendSmsString == "true" ? true : false
|
||
// };
|
||
// _contactInfoApplication.Create(contactinfo);
|
||
|
||
// }
|
||
// Thread.Sleep(500);
|
||
//}
|
||
|
||
|
||
return result;
|
||
}
|
||
|
||
[HttpGet("print/{id}")]
|
||
public async Task<ActionResult<InstitutionContractPrintViewModel>> PrintOne(long id)
|
||
{
|
||
var res = await _institutionContractApplication.PrintOneAsync(id);
|
||
return res;
|
||
}
|
||
|
||
[HttpPost("mannual-verify/{id}")]
|
||
public async Task<ActionResult<OperationResult>> VerifyInstitutionContractManually(long id)
|
||
{
|
||
var res = await _institutionContractApplication.VerifyInstitutionContractManually(id);
|
||
return res;
|
||
}
|
||
|
||
[HttpGet("excel-download")]
|
||
public async Task<IActionResult> ExcelDownload()
|
||
{
|
||
var searchModel = new InstitutionContractListSearchModel();
|
||
|
||
var dataVm = new List<InstitutionContractExcelViewModel>();
|
||
|
||
foreach (var name in typeof(InstitutionContractListStatus).GetEnumNames())
|
||
{
|
||
var @enum = Enum.Parse<InstitutionContractListStatus>(name);
|
||
searchModel.Status = @enum;
|
||
searchModel.PageSize = 99999;
|
||
var data = (await (_institutionContractApplication.GetList(searchModel))).List;
|
||
dataVm.Add(new InstitutionContractExcelViewModel()
|
||
{ Tab = @enum, GetInstitutionContractListItemsViewModels = data });
|
||
}
|
||
|
||
searchModel.Status = null;
|
||
|
||
var nullData = (await (_institutionContractApplication.GetList(searchModel))).List;
|
||
dataVm.Add(new InstitutionContractExcelViewModel()
|
||
{ Tab = null, GetInstitutionContractListItemsViewModels = nullData });
|
||
|
||
var bytes = InstitutionContractExcelGenerator.GenerateExcel(dataVm);
|
||
return File(bytes,
|
||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||
$"قرارداد های مالی.xlsx");
|
||
}
|
||
}
|
||
|
||
public class InstitutionContractCreationGetRepresentativeIdResponse
|
||
{
|
||
public long RepresentativeId { get; set; }
|
||
}
|
||
|
||
public class VerifyOtpRequest
|
||
{
|
||
public Guid PublicId { get; set; }
|
||
public string Code { get; set; }
|
||
}
|
||
|
||
public class InstitutionVerificationRequest
|
||
{
|
||
public Guid Id { get; set; }
|
||
public string Code { get; set; }
|
||
}
|
||
|
||
public class InstitutionPlanCalculatorResponse
|
||
{
|
||
public string TotalAmountWithTax { get; set; }
|
||
public string OneTimeTotalAmountWithoutTax { get; set; }
|
||
public string OneTimeTotalAmount { get; set; }
|
||
public string OneTimeValueAddedTaxStr { get; set; }
|
||
public string MonthlyTotalAmount { get; set; }
|
||
public string MonthlyTotalAmountWithoutTax { get; set; }
|
||
public string ContractStart { get; set; }
|
||
public string ContractEnd { get; set; }
|
||
public string MonthlyValueAddedTaxStr { get; set; }
|
||
public string DailyCompensation { get; set; }
|
||
public string Obligation { get; set; }
|
||
public string PaymentForOneMonth { get; set; }
|
||
|
||
public string DiscountedAmountForOneMonth { get; set; }
|
||
public string Discount { get; set; }
|
||
public List<MonthlyInstallment> Installments { get; set; }
|
||
}
|
||
|
||
public class WorkshopServiceCalculatorResponse
|
||
{
|
||
public string TotalAmount { get; set; }
|
||
}
|
||
|
||
public record InstitutionPlanCalculatorRequest(
|
||
double TotalAmountMonth,
|
||
bool HasInPersonContract,
|
||
InstitutionContractDuration Duration = InstitutionContractDuration.TwelveMonths);
|
||
|
||
public class VerifyCodeRequest
|
||
{
|
||
public long ContractingPartyId { get; set; }
|
||
public string verifyCode { get; set; }
|
||
} |