From ec277629fb9e8a337a86195cdcbe53951a106c16 Mon Sep 17 00:00:00 2001 From: MahanCh Date: Sun, 4 May 2025 20:58:45 +0330 Subject: [PATCH] fix register financial problems --- 0_Framework/Application/Tools.cs | 17 + ...ITemporaryClientRegistrationApplication.cs | 7 +- .../ReviewAndPaymentViewModel.cs | 46 +- .../TemporaryClientRegistrationApplication.cs | 1234 +++++++++-------- ServiceHost/Pages/Register/Index.cshtml.cs | 8 +- .../Pages/Register/_Partials/_Step4.cshtml | 136 +- .../pages/Register/css/_Partials/_Step3.css | 99 +- .../pages/Register/css/_Partials/_Step4.css | 21 +- .../pages/Register/js/_Partials/_Step3.js | 517 ++++--- .../pages/Register/js/_Partials/_Step4.js | 84 +- 10 files changed, 1277 insertions(+), 892 deletions(-) diff --git a/0_Framework/Application/Tools.cs b/0_Framework/Application/Tools.cs index 4c8f4408..b2708d08 100644 --- a/0_Framework/Application/Tools.cs +++ b/0_Framework/Application/Tools.cs @@ -41,6 +41,23 @@ public static class Tools return Regex.IsMatch(mobileNo, "^((09))(\\d{9})$"); } + /// + /// تاریخ شروع و تعداد ماه را میگیرد و تاریخ پایان قراردا را بر میگرداند + /// + /// + /// + /// + public static (DateTime endDateGr, string endDateFa) FindEndOfContract(string startDate, string monthPlus) + { + + int startYear = Convert.ToInt32(startDate.Substring(0, 4)); + int startMonth = Convert.ToInt32(startDate.Substring(5, 2)); + int startDay = Convert.ToInt32(startDate.Substring(8, 2)); + var start = new PersianDateTime(startYear, startMonth, startDay); + var end = (start.AddMonths(Convert.ToInt32(monthPlus))).AddDays(-1); + return ($"{end}".ToGeorgianDateTime(), $"{end}"); + + } /// /// دریافت روزهای کارکرد پرسنل در لیست بیمه ماه مشخص شده diff --git a/CompanyManagment.App.Contracts/TemporaryClientRegistration/ITemporaryClientRegistrationApplication.cs b/CompanyManagment.App.Contracts/TemporaryClientRegistration/ITemporaryClientRegistrationApplication.cs index ea15028c..6e654328 100644 --- a/CompanyManagment.App.Contracts/TemporaryClientRegistration/ITemporaryClientRegistrationApplication.cs +++ b/CompanyManagment.App.Contracts/TemporaryClientRegistration/ITemporaryClientRegistrationApplication.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using _0_Framework.Application; using CompanyManagment.App.Contracts.InstitutionPlan; @@ -55,14 +56,14 @@ public interface ITemporaryClientRegistrationApplication /// /// Task GetTotalPaymentAndWorkshopList(long contractingPartyTempId, - string periodModel = "12", string paymentModel = "OneTime"); + string periodModel = "12", string paymentModel = "OneTime", string contractStartType = "currentMonth"); /// /// ایجاد یا ویرایش قرارداد موقت /// /// /// - Task CreateOrUpdateInstitutionContractTemp(long contractingPartyTempId, string periodModel, string paymentModel, double totalPayment, double valueAddedTax); + Task CreateOrUpdateInstitutionContractTemp(long contractingPartyTempId, string periodModel, string paymentModel, double totalPayment, double valueAddedTax, DateTime contractStart); /// /// دریافت کد برای کلاینت diff --git a/CompanyManagment.App.Contracts/TemporaryClientRegistration/ReviewAndPaymentViewModel.cs b/CompanyManagment.App.Contracts/TemporaryClientRegistration/ReviewAndPaymentViewModel.cs index 2a1c47c4..10912190 100644 --- a/CompanyManagment.App.Contracts/TemporaryClientRegistration/ReviewAndPaymentViewModel.cs +++ b/CompanyManagment.App.Contracts/TemporaryClientRegistration/ReviewAndPaymentViewModel.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace CompanyManagment.App.Contracts.TemporaryClientRegistration; @@ -114,4 +115,47 @@ public class ReviewAndPaymentViewModel /// لیست اقساط ماهیانه /// public List MonthlyInstallments { get; set; } + + + /// + /// تاریخ شروع قرارداد در اول ماه جاری + /// - + /// شمسی + /// + public string ContractStartCurrentMonthFa { get; set; } + + /// + /// تاریخ شروع قرارداد در اول ماه جاری + /// - + /// میلادی + /// + public DateTime ContractStartCurrentMonthGr { get; set; } + + /// + /// تاریخ شروع قرارداد در اول ماه بعد + /// - + /// شمسی + /// + public string ContractStartNextMonthFa{ get; set; } + + /// + /// تاریخ شروع قرارداد در اول ماه بعد + /// - + /// میلادی + /// + public DateTime ContractStartNextMonthGr { get; set; } + + /// + /// تاریخ پایان قرارداد + /// - + /// میلادی + /// + public DateTime ContractEndGr { get; set; } + + /// + /// تاریخ پایان قرارداد + /// - + /// شمسی + /// + public string ContractEndFa { get; set; } } \ No newline at end of file diff --git a/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs b/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs index c7307dd1..356e239d 100644 --- a/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs +++ b/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs @@ -18,683 +18,701 @@ namespace CompanyManagment.Application; public class TemporaryClientRegistrationApplication : ITemporaryClientRegistrationApplication { - private readonly IContractingPartyTempRepository _contractingPartyTempRepository; - private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; - private readonly IUidService _uidService; - private readonly IWorkshopTempRepository _workshopTempRepository; - private readonly IPlanPercentageRepository _planPercentageRepository; - private readonly IWorkshopServicesTempRepository _workshopServicesTempRepository; - private readonly IInstitutionContractTempRepository _institutionContractTempRepository; - private readonly ISmsService _smsService; - - public TemporaryClientRegistrationApplication(IContractingPartyTempRepository contractingPartyTempRepository, IPersonalContractingPartyRepository personalContractingPartyRepository, IUidService uidService, IWorkshopTempRepository workshopTempRepository, IPlanPercentageRepository planPercentageRepository, IWorkshopServicesTempRepository workshopServicesTempRepository, IInstitutionContractTempRepository institutionContractTempRepository, ISmsService smsService) - { - _contractingPartyTempRepository = contractingPartyTempRepository; - _personalContractingPartyRepository = personalContractingPartyRepository; - _uidService = uidService; - _workshopTempRepository = workshopTempRepository; - _planPercentageRepository = planPercentageRepository; - _workshopServicesTempRepository = workshopServicesTempRepository; - _institutionContractTempRepository = institutionContractTempRepository; - _smsService = smsService; - } - - /// - /// احراز هویت - /// - /// - /// - /// - /// - public async Task> CreateContractingPartyTemp(string nationalCode, string dateOfBirth, string mobile) - { - var op = new OperationResult(); - - #region Validations - - if (string.IsNullOrWhiteSpace(nationalCode) || string.IsNullOrWhiteSpace(dateOfBirth) || - string.IsNullOrWhiteSpace(mobile)) - return op.Failed("هیچ یک از فیلد ها نمیتواند خالی باشد"); - - - if (nationalCode.NationalCodeValid() != "valid") - return op.Failed("کد ملی نا معتبر است"); - - if (!dateOfBirth.IsPersianDateValid()) - return op.Failed("تاریخ تولد نا معتبر است"); - - if (!mobile.IsMobileValid()) - return op.Failed("شماره همراه نا معتبر است"); - - - - #endregion - - - var getExistContractingParty = await _contractingPartyTempRepository.CheckExistOrAuthenticated(nationalCode, dateOfBirth); - - //اگر طرف حساب قبلا در دیتابیس وجود داشت - if (getExistContractingParty) - { - return op.Failed("طرف حساب با این مشخصات در سیستم وجود دارد"); - } - //اگر طرف حساب وجود نداشت - else - { - //دریافت اطلاعات طرف حساب موقت که قبلا ایجاد شده - var getExistTemp = _contractingPartyTempRepository.GetByNationalCode(nationalCode); - - var dateOfBirthGr = dateOfBirth.ToGeorgianDateTime(); - - - //اگر طرف حساب موقت قبلا ایجاد شده دیتای آن را برمیگرداند - if (getExistTemp != null) - { - var institutionContractTemp = await - _institutionContractTempRepository.GetInstitutionContractTemp(0, getExistTemp.Id); - - if (institutionContractTemp != null) - { - - if (institutionContractTemp.RegistrationStatus == "Completed") - return op.Failed("شما قبلا ثبت نام خود را تکمیل نموده اید"); - } - - if (getExistTemp.DateOfBirth != dateOfBirthGr) - return op.Failed("تاریخ تولد مطابقت ندارد"); - if (getExistTemp.Phone != mobile) - return op.Failed("شما قبلا با شماره همراه دیگری ثبت نام نموده اید"); - return op.Succcedded(getExistTemp); - - } - //چک کردن مطابقت شماره همراه و کد ملی - var isMachMobilAndNationalCode = await _uidService.IsMachPhoneWithNationalCode(nationalCode, mobile); - if (isMachMobilAndNationalCode == null) - return op.Failed("خطا در سرویس احراز هویت"); - if (!isMachMobilAndNationalCode.IsMatched) - return op.Failed("شماره همراه وارد شده با کد ملی مطابقت ندارد"); - - //دریافت اطلاعات احراز هویت - var apiRespons = await _uidService.GetPersonalInfo(nationalCode, dateOfBirth); - - if (apiRespons == null) - return op.Failed("خطا در سرویس احراز هویت"); - if (apiRespons.ResponseContext.Status.Code != 0) - return op.Failed($"{apiRespons.ResponseContext.Status.Message}"); - - var idNumber = apiRespons.IdentificationInformation.ShenasnamehNumber == "0" - ? apiRespons.IdentificationInformation.NationalId - : apiRespons.IdentificationInformation.ShenasnamehNumber; - - //ایجاد طرف حساب موقت - var createTemp = new ContractingPartyTemp(apiRespons.BasicInformation.FirstName, - apiRespons.BasicInformation.LastName, nationalCode, idNumber, mobile, - apiRespons.BasicInformation.FatherName, "", "", "", - apiRespons.IdentificationInformation.ShenasnameSeri, - apiRespons.IdentificationInformation.ShenasnameSerial, apiRespons.BasicInformation.GenderEnum, - dateOfBirthGr); - await _contractingPartyTempRepository.CreateAsync(createTemp); - await _contractingPartyTempRepository.SaveChangesAsync(); - - var result = new ContractingPartyTempViewModel(); - result.Id = createTemp.id; - result.FName = createTemp.FName; - result.LName = createTemp.LName; - result.DateOfBirthFa = dateOfBirth; - result.FatherName = createTemp.FatherName; - result.IdNumberSerial = createTemp.IdNumberSerial; - result.IdNumber = idNumber; - - return op.Succcedded(result); - } - - - - } - - /// - /// تکمیل اطلاعات - /// - /// - /// - /// - /// - /// - - public async Task UpdateAddress(long id, string state, string city, string address) - { - var op = new OperationResult(); - var contractingPartyTemp = _contractingPartyTempRepository.Get(id); - - if (string.IsNullOrWhiteSpace(state) || string.IsNullOrWhiteSpace(city) || string.IsNullOrWhiteSpace(address)) - return op.Failed("اطلاعات ادرس را تکمیل کنید"); - - contractingPartyTemp.UpdateAddress(state, city, address); - await _contractingPartyTempRepository.SaveChangesAsync(); - - return op.Succcedded(); - } - - /// - /// دریافت کارگاه های ذخیره شده - /// - /// - /// - public Task> GetWorkshopTemp(long contractingPartyTempId) - { - return _workshopTempRepository.GetWorkshopTemp(contractingPartyTempId); - } - - /// - /// ایجاد یا ویرایش کارگاه و سرویس های آن - /// - /// - /// - public async Task CreateOrUpdateWorkshopTemp(List command, long contractingPartyTempId) - { - var op = new OperationResult(); - var updateWorkshopList = command.Where(x => x.Id > 0).ToList(); - var createNewWorkshopList = command.Where(x => x.Id == 0).ToList(); - - if (updateWorkshopList.Count == 0 && createNewWorkshopList.Count == 0) - return op.Failed("هیچ مجموعه ای ایجاد نشده است"); - var oldWorkshops = await _workshopTempRepository.GetWorkshopTemp(contractingPartyTempId); - - #region Update - if (updateWorkshopList.Count > 0) - { - var updateListIds = updateWorkshopList.Select(x => x.Id).ToList(); - var oldWorkshopsIds = oldWorkshops.Select(x => x.Id).ToList(); - var exceptWorkshops = oldWorkshopsIds.Except(updateListIds).ToList(); - if (exceptWorkshops.Any()) - await _workshopTempRepository.RemoveWorkshopTemps(exceptWorkshops); - - - foreach (var workshop in updateWorkshopList) - { - - if (string.IsNullOrWhiteSpace(workshop.WorkshopName)) - return op.Failed("نام مجموعه نمی تواند خالی باشد"); - if (workshop.CountPerson == 0) - op.Failed($"تعداد پرسنل مجوعه {workshop.WorkshopName} صفر است"); - if (workshop.ContractAndCheckout == false && workshop.CustomizeCheckout == false && - workshop.RollCall == false && workshop.Insurance == false) - op.Failed($"برای مجموعه {workshop.WorkshopName} هیچ سرویسی انتخاب نشده است"); - var existWorkshops = _workshopTempRepository.Get(workshop.Id); - - if (existWorkshops != null) - { - if (workshop.ContractAndCheckout) - workshop.ContractAndCheckoutInPerson = true; - if (workshop.Insurance) - workshop.InsuranceInPerson = true; - - //دریافت مبالغ سرویس ها - var plan = _planPercentageRepository.GetInstitutionPlanForWorkshop(workshop); - if (plan.OnlineAndInPersonSumAmountDouble > 0) - { - //ویرایش مشخصات کارگاه - existWorkshops.Edit(workshop.WorkshopName, workshop.CountPerson, plan.OnlineAndInPersonSumAmountDouble); - await _workshopTempRepository.SaveChangesAsync(); - - //حذف سرویس های قبلی - _workshopServicesTempRepository.RemoveServices(workshop.Id); - - //سرویس قرداد - if (workshop.ContractAndCheckout) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("ContractAndCheckout", workshop.CountPerson, workshop.Id)); - //سرویس خدمات حضوری قرارداد - if (workshop.ContractAndCheckoutInPerson) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("ContractAndCheckoutInPerson", workshop.CountPerson, workshop.Id)); - - //سرویس بیمه - if (workshop.Insurance) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("Insurance", workshop.CountPerson, workshop.Id)); - //سرویس خدمات حضوری بیمه - if (workshop.InsuranceInPerson) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("InsuranceInPerson", workshop.CountPerson, workshop.Id)); - - //سرویس حضورغیاب - if (workshop.RollCall) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("RollCall", workshop.CountPerson, workshop.Id)); - //سرویس فیش غیر رسمی - if (workshop.CustomizeCheckout) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("CustomizeCheckout", workshop.CountPerson, workshop.Id)); - - await _workshopServicesTempRepository.SaveChangesAsync(); - } - - } - - } - - } - #endregion - - #region Create - - if (createNewWorkshopList.Count > 0) - { - foreach (var workshop in createNewWorkshopList) - { - - if (string.IsNullOrWhiteSpace(workshop.WorkshopName)) - return op.Failed("نام مجموعه نمی تواند خالی باشد"); - if (workshop.CountPerson == 0) - op.Failed($"تعداد پرسنل مجوعه {workshop.WorkshopName} صفر است"); - if (workshop.ContractAndCheckout == false && workshop.CustomizeCheckout == false && - workshop.RollCall == false && workshop.Insurance == false) - op.Failed($"برای مجموعه {workshop.WorkshopName} هیچ سرویسی انتخاب نشده است"); - - if (workshop.ContractAndCheckout) - workshop.ContractAndCheckoutInPerson = true; - if (workshop.Insurance) - workshop.InsuranceInPerson = true; - - //دریافت مبالغ سرویس ها - var plan = _planPercentageRepository.GetInstitutionPlanForWorkshop(workshop); - if (plan.OnlineAndInPersonSumAmountDouble > 0) - { - - - var createNewWorkshopTemp = new WorkshopTemp(workshop.WorkshopName, workshop.CountPerson, - workshop.ContractingPartyTempId, plan.OnlineAndInPersonSumAmountDouble); - await _workshopTempRepository.CreateAsync(createNewWorkshopTemp); - await _workshopTempRepository.SaveChangesAsync(); - - - - //سرویس قرداد - if (workshop.ContractAndCheckout) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("ContractAndCheckout", workshop.CountPerson, createNewWorkshopTemp.id)); - //سرویس خدمات حضوری قرارداد - if (workshop.ContractAndCheckoutInPerson) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("ContractAndCheckoutInPerson", workshop.CountPerson, createNewWorkshopTemp.id)); - - //سرویس بیمه - if (workshop.Insurance) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("Insurance", workshop.CountPerson, createNewWorkshopTemp.id)); - //سرویس خدمات حضوری بیمه - if (workshop.InsuranceInPerson) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("InsuranceInPerson", workshop.CountPerson, createNewWorkshopTemp.id)); - - //سرویس حضورغیاب - if (workshop.RollCall) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("RollCall", workshop.CountPerson, createNewWorkshopTemp.id)); - //سرویس فیش غیر رسمی - if (workshop.CustomizeCheckout) - await _workshopServicesTempRepository.CreateAsync( - new WorkshopServicesTemp("CustomizeCheckout", workshop.CountPerson, createNewWorkshopTemp.id)); - - await _workshopServicesTempRepository.SaveChangesAsync(); - } - - } - } - - #endregion - - - return op.Succcedded(); - } - - /// - /// دریافت جمع کل خدمات برای یک کارگاه - /// - /// - /// - public InstitutionPlanViewModel GetInstitutionPlanForWorkshop(WorkshopTempViewModel workshop) - { - return _planPercentageRepository.GetInstitutionPlanForWorkshop(workshop); - } - - - /// - /// بررسی و پرداخت - /// اطلاعات کامل مبالغ - /// - /// - /// - public async Task GetTotalPaymentAndWorkshopList(long contractingPartyTempId, string periodModel = "12", string paymentModel = "OneTime") + private readonly IContractingPartyTempRepository _contractingPartyTempRepository; + private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; + private readonly IUidService _uidService; + private readonly IWorkshopTempRepository _workshopTempRepository; + private readonly IPlanPercentageRepository _planPercentageRepository; + private readonly IWorkshopServicesTempRepository _workshopServicesTempRepository; + private readonly IInstitutionContractTempRepository _institutionContractTempRepository; + private readonly ISmsService _smsService; + + public TemporaryClientRegistrationApplication(IContractingPartyTempRepository contractingPartyTempRepository, IPersonalContractingPartyRepository personalContractingPartyRepository, IUidService uidService, IWorkshopTempRepository workshopTempRepository, IPlanPercentageRepository planPercentageRepository, IWorkshopServicesTempRepository workshopServicesTempRepository, IInstitutionContractTempRepository institutionContractTempRepository, ISmsService smsService) { - - //دریافت کارگاه ها - var workshops = await _workshopTempRepository.GetWorkshopTemp(contractingPartyTempId); + _contractingPartyTempRepository = contractingPartyTempRepository; + _personalContractingPartyRepository = personalContractingPartyRepository; + _uidService = uidService; + _workshopTempRepository = workshopTempRepository; + _planPercentageRepository = planPercentageRepository; + _workshopServicesTempRepository = workshopServicesTempRepository; + _institutionContractTempRepository = institutionContractTempRepository; + _smsService = smsService; + } - double totalPayment1MonthDouble = 0; + /// + /// احراز هویت + /// + /// + /// + /// + /// + public async Task> CreateContractingPartyTemp(string nationalCode, string dateOfBirth, string mobile) + { + var op = new OperationResult(); - //بدست آوردن جمع کل برای یک ماه - foreach (var workshop in workshops) - { - totalPayment1MonthDouble += workshop.WorkshopServicesAmount; - } + #region Validations - if (totalPayment1MonthDouble == 0) - return new ReviewAndPaymentViewModel(); - - var result = new ReviewAndPaymentViewModel(); - - int months = 0; - months = periodModel switch - { - "1" => 1, - "3" => 3, - "6" => 6, - "12" => 12, - _ => 12, - }; - //رند کردن مبالغ کارگاه ها - var roundAmount = (((Convert.ToInt32(totalPayment1MonthDouble))) / 1000000) * 1000000; - double roundAmount2 = roundAmount; - //بدست آوردن جمع کل مبالغ کارگاه بر اساس مدت قراداد - result.SumOfWorkshopsPaymentDouble = months * roundAmount2; - result.SumOfWorkshopsPaymentPaymentStr = result.SumOfWorkshopsPaymentDouble.ToMoney(); + if (string.IsNullOrWhiteSpace(nationalCode) || string.IsNullOrWhiteSpace(dateOfBirth) || + string.IsNullOrWhiteSpace(mobile)) + return op.Failed("هیچ یک از فیلد ها نمیتواند خالی باشد"); - result.PeriodModel = periodModel; - result.PaymentModel = paymentModel; + if (nationalCode.NationalCodeValid() != "valid") + return op.Failed("کد ملی نا معتبر است"); + + if (!dateOfBirth.IsPersianDateValid()) + return op.Failed("تاریخ تولد نا معتبر است"); + + if (!mobile.IsMobileValid()) + return op.Failed("شماره همراه نا معتبر است"); - var tenPercent = result.SumOfWorkshopsPaymentDouble * 10 / 100; - //مالیات - result.ValueAddedTaxDouble = tenPercent; - result.ValueAddedTaxSt = tenPercent.ToMoney(); + + #endregion + + + var getExistContractingParty = await _contractingPartyTempRepository.CheckExistOrAuthenticated(nationalCode, dateOfBirth); + + //اگر طرف حساب قبلا در دیتابیس وجود داشت + if (getExistContractingParty) + { + return op.Failed("طرف حساب با این مشخصات در سیستم وجود دارد"); + } + //اگر طرف حساب وجود نداشت + else + { + //دریافت اطلاعات طرف حساب موقت که قبلا ایجاد شده + var getExistTemp = _contractingPartyTempRepository.GetByNationalCode(nationalCode); + + var dateOfBirthGr = dateOfBirth.ToGeorgianDateTime(); + + + //اگر طرف حساب موقت قبلا ایجاد شده دیتای آن را برمیگرداند + if (getExistTemp != null) + { + var institutionContractTemp = await + _institutionContractTempRepository.GetInstitutionContractTemp(0, getExistTemp.Id); + + if (institutionContractTemp != null) + { + + if (institutionContractTemp.RegistrationStatus == "Completed") + return op.Failed("شما قبلا ثبت نام خود را تکمیل نموده اید"); + } + + if (getExistTemp.DateOfBirth != dateOfBirthGr) + return op.Failed("تاریخ تولد مطابقت ندارد"); + if (getExistTemp.Phone != mobile) + return op.Failed("شما قبلا با شماره همراه دیگری ثبت نام نموده اید"); + return op.Succcedded(getExistTemp); + + } + //چک کردن مطابقت شماره همراه و کد ملی + var isMachMobilAndNationalCode = await _uidService.IsMachPhoneWithNationalCode(nationalCode, mobile); + if (isMachMobilAndNationalCode == null) + return op.Failed("خطا در سرویس احراز هویت"); + if (!isMachMobilAndNationalCode.IsMatched) + return op.Failed("شماره همراه وارد شده با کد ملی مطابقت ندارد"); + + //دریافت اطلاعات احراز هویت + var apiRespons = await _uidService.GetPersonalInfo(nationalCode, dateOfBirth); + + if (apiRespons == null) + return op.Failed("خطا در سرویس احراز هویت"); + if (apiRespons.ResponseContext.Status.Code != 0) + return op.Failed($"{apiRespons.ResponseContext.Status.Message}"); + + var idNumber = apiRespons.IdentificationInformation.ShenasnamehNumber == "0" + ? apiRespons.IdentificationInformation.NationalId + : apiRespons.IdentificationInformation.ShenasnamehNumber; + + //ایجاد طرف حساب موقت + var createTemp = new ContractingPartyTemp(apiRespons.BasicInformation.FirstName, + apiRespons.BasicInformation.LastName, nationalCode, idNumber, mobile, + apiRespons.BasicInformation.FatherName, "", "", "", + apiRespons.IdentificationInformation.ShenasnameSeri, + apiRespons.IdentificationInformation.ShenasnameSerial, apiRespons.BasicInformation.GenderEnum, + dateOfBirthGr); + await _contractingPartyTempRepository.CreateAsync(createTemp); + await _contractingPartyTempRepository.SaveChangesAsync(); + + var result = new ContractingPartyTempViewModel(); + result.Id = createTemp.id; + result.FName = createTemp.FName; + result.LName = createTemp.LName; + result.DateOfBirthFa = dateOfBirth; + result.FatherName = createTemp.FatherName; + result.IdNumberSerial = createTemp.IdNumberSerial; + result.IdNumber = idNumber; + + return op.Succcedded(result); + } + + + + } + + /// + /// تکمیل اطلاعات + /// + /// + /// + /// + /// + /// + + public async Task UpdateAddress(long id, string state, string city, string address) + { + var op = new OperationResult(); + var contractingPartyTemp = _contractingPartyTempRepository.Get(id); + + if (string.IsNullOrWhiteSpace(state) || string.IsNullOrWhiteSpace(city) || string.IsNullOrWhiteSpace(address)) + return op.Failed("اطلاعات ادرس را تکمیل کنید"); + + contractingPartyTemp.UpdateAddress(state, city, address); + await _contractingPartyTempRepository.SaveChangesAsync(); + + return op.Succcedded(); + } + + /// + /// دریافت کارگاه های ذخیره شده + /// + /// + /// + public Task> GetWorkshopTemp(long contractingPartyTempId) + { + return _workshopTempRepository.GetWorkshopTemp(contractingPartyTempId); + } + + /// + /// ایجاد یا ویرایش کارگاه و سرویس های آن + /// + /// + /// + public async Task CreateOrUpdateWorkshopTemp(List command, long contractingPartyTempId) + { + var op = new OperationResult(); + var updateWorkshopList = command.Where(x => x.Id > 0).ToList(); + var createNewWorkshopList = command.Where(x => x.Id == 0).ToList(); + + if (updateWorkshopList.Count == 0 && createNewWorkshopList.Count == 0) + return op.Failed("هیچ مجموعه ای ایجاد نشده است"); + var oldWorkshops = await _workshopTempRepository.GetWorkshopTemp(contractingPartyTempId); + + #region Update + if (updateWorkshopList.Count > 0) + { + var updateListIds = updateWorkshopList.Select(x => x.Id).ToList(); + var oldWorkshopsIds = oldWorkshops.Select(x => x.Id).ToList(); + var exceptWorkshops = oldWorkshopsIds.Except(updateListIds).ToList(); + if (exceptWorkshops.Any()) + await _workshopTempRepository.RemoveWorkshopTemps(exceptWorkshops); + + + foreach (var workshop in updateWorkshopList) + { + + if (string.IsNullOrWhiteSpace(workshop.WorkshopName)) + return op.Failed("نام مجموعه نمی تواند خالی باشد"); + if (workshop.CountPerson == 0) + op.Failed($"تعداد پرسنل مجوعه {workshop.WorkshopName} صفر است"); + if (workshop.ContractAndCheckout == false && workshop.CustomizeCheckout == false && + workshop.RollCall == false && workshop.Insurance == false) + op.Failed($"برای مجموعه {workshop.WorkshopName} هیچ سرویسی انتخاب نشده است"); + var existWorkshops = _workshopTempRepository.Get(workshop.Id); + + if (existWorkshops != null) + { + if (workshop.ContractAndCheckout) + workshop.ContractAndCheckoutInPerson = true; + if (workshop.Insurance) + workshop.InsuranceInPerson = true; + + //دریافت مبالغ سرویس ها + var plan = _planPercentageRepository.GetInstitutionPlanForWorkshop(workshop); + if (plan.OnlineAndInPersonSumAmountDouble > 0) + { + //ویرایش مشخصات کارگاه + existWorkshops.Edit(workshop.WorkshopName, workshop.CountPerson, plan.OnlineAndInPersonSumAmountDouble); + await _workshopTempRepository.SaveChangesAsync(); + + //حذف سرویس های قبلی + _workshopServicesTempRepository.RemoveServices(workshop.Id); + + //سرویس قرداد + if (workshop.ContractAndCheckout) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("ContractAndCheckout", workshop.CountPerson, workshop.Id)); + //سرویس خدمات حضوری قرارداد + if (workshop.ContractAndCheckoutInPerson) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("ContractAndCheckoutInPerson", workshop.CountPerson, workshop.Id)); + + //سرویس بیمه + if (workshop.Insurance) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("Insurance", workshop.CountPerson, workshop.Id)); + //سرویس خدمات حضوری بیمه + if (workshop.InsuranceInPerson) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("InsuranceInPerson", workshop.CountPerson, workshop.Id)); + + //سرویس حضورغیاب + if (workshop.RollCall) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("RollCall", workshop.CountPerson, workshop.Id)); + //سرویس فیش غیر رسمی + if (workshop.CustomizeCheckout) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("CustomizeCheckout", workshop.CountPerson, workshop.Id)); + + await _workshopServicesTempRepository.SaveChangesAsync(); + } + + } + + } + + } + #endregion + + #region Create + + if (createNewWorkshopList.Count > 0) + { + foreach (var workshop in createNewWorkshopList) + { + + if (string.IsNullOrWhiteSpace(workshop.WorkshopName)) + return op.Failed("نام مجموعه نمی تواند خالی باشد"); + if (workshop.CountPerson == 0) + op.Failed($"تعداد پرسنل مجوعه {workshop.WorkshopName} صفر است"); + if (workshop.ContractAndCheckout == false && workshop.CustomizeCheckout == false && + workshop.RollCall == false && workshop.Insurance == false) + op.Failed($"برای مجموعه {workshop.WorkshopName} هیچ سرویسی انتخاب نشده است"); + + if (workshop.ContractAndCheckout) + workshop.ContractAndCheckoutInPerson = true; + if (workshop.Insurance) + workshop.InsuranceInPerson = true; + + //دریافت مبالغ سرویس ها + var plan = _planPercentageRepository.GetInstitutionPlanForWorkshop(workshop); + if (plan.OnlineAndInPersonSumAmountDouble > 0) + { + + + var createNewWorkshopTemp = new WorkshopTemp(workshop.WorkshopName, workshop.CountPerson, + workshop.ContractingPartyTempId, plan.OnlineAndInPersonSumAmountDouble); + await _workshopTempRepository.CreateAsync(createNewWorkshopTemp); + await _workshopTempRepository.SaveChangesAsync(); + + + + //سرویس قرداد + if (workshop.ContractAndCheckout) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("ContractAndCheckout", workshop.CountPerson, createNewWorkshopTemp.id)); + //سرویس خدمات حضوری قرارداد + if (workshop.ContractAndCheckoutInPerson) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("ContractAndCheckoutInPerson", workshop.CountPerson, createNewWorkshopTemp.id)); + + //سرویس بیمه + if (workshop.Insurance) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("Insurance", workshop.CountPerson, createNewWorkshopTemp.id)); + //سرویس خدمات حضوری بیمه + if (workshop.InsuranceInPerson) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("InsuranceInPerson", workshop.CountPerson, createNewWorkshopTemp.id)); + + //سرویس حضورغیاب + if (workshop.RollCall) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("RollCall", workshop.CountPerson, createNewWorkshopTemp.id)); + //سرویس فیش غیر رسمی + if (workshop.CustomizeCheckout) + await _workshopServicesTempRepository.CreateAsync( + new WorkshopServicesTemp("CustomizeCheckout", workshop.CountPerson, createNewWorkshopTemp.id)); + + await _workshopServicesTempRepository.SaveChangesAsync(); + } + + } + } + + #endregion + + + return op.Succcedded(); + } + + /// + /// دریافت جمع کل خدمات برای یک کارگاه + /// + /// + /// + public InstitutionPlanViewModel GetInstitutionPlanForWorkshop(WorkshopTempViewModel workshop) + { + return _planPercentageRepository.GetInstitutionPlanForWorkshop(workshop); + } + + + /// + /// بررسی و پرداخت + /// اطلاعات کامل مبالغ + /// + /// + /// + public async Task GetTotalPaymentAndWorkshopList(long contractingPartyTempId, string periodModel = "12", string paymentModel = "OneTime", string contractStartType = "currentMonth") + { + + //دریافت کارگاه ها + var workshops = await _workshopTempRepository.GetWorkshopTemp(contractingPartyTempId); + + double totalPayment1MonthDouble = 0; + + //بدست آوردن جمع کل برای یک ماه + foreach (var workshop in workshops) + { + totalPayment1MonthDouble += workshop.WorkshopServicesAmount; + } + + if (totalPayment1MonthDouble == 0) + return new ReviewAndPaymentViewModel(); + + var result = new ReviewAndPaymentViewModel(); + + int months = 0; + months = periodModel switch + { + "1" => 1, + "3" => 3, + "6" => 6, + "12" => 12, + _ => 12, + }; + //رند کردن مبالغ کارگاه ها + var roundAmount = (((Convert.ToInt64(totalPayment1MonthDouble))) / 1000000) * 1000000; + double roundAmount2 = roundAmount; + //بدست آوردن جمع کل مبالغ کارگاه بر اساس مدت قراداد + result.SumOfWorkshopsPaymentDouble = months * roundAmount2; + result.SumOfWorkshopsPaymentPaymentStr = result.SumOfWorkshopsPaymentDouble.ToMoney(); + + + result.PeriodModel = periodModel; + result.PaymentModel = paymentModel; + + + var tenPercent = result.SumOfWorkshopsPaymentDouble * 10 / 100; + //مالیات + result.ValueAddedTaxDouble = tenPercent; + result.ValueAddedTaxSt = tenPercent.ToMoney(); //پرداخت یکجا #region OneTimePaymentResult - double discountOneTimePeyment = result.SumOfWorkshopsPaymentDouble - tenPercent; - - - //مبلغ بدون مالیات و با تخفیف - result.OneTimeWithoutTaxPaymentDouble = discountOneTimePeyment; - result.OneTimeWithoutTaxPaymentStr = discountOneTimePeyment.ToMoney(); - - //مبلغ با مالیات - result.OneTimeTotalPaymentDouble = discountOneTimePeyment + tenPercent; - result.OneTimeTotalPaymentStr = result.OneTimeTotalPaymentDouble.ToMoney(); + double discountOneTimePeyment = result.SumOfWorkshopsPaymentDouble - tenPercent; + + + //مبلغ بدون مالیات و با تخفیف + result.OneTimeWithoutTaxPaymentDouble = discountOneTimePeyment; + result.OneTimeWithoutTaxPaymentStr = discountOneTimePeyment.ToMoney(); + + //مبلغ با مالیات + result.OneTimeTotalPaymentDouble = discountOneTimePeyment + tenPercent; + result.OneTimeTotalPaymentStr = result.OneTimeTotalPaymentDouble.ToMoney(); #endregion //پرداخت ماهیانه #region MonthlyPaymentResult - //مبلغ بدون مالیات - result.MonthlyWithoutTaxPaymentDouble = result.SumOfWorkshopsPaymentDouble; - result.MonthlyWithoutTaxPaymentStr = result.SumOfWorkshopsPaymentDouble.ToMoney(); - - // مبلغ با مالیات - result.MonthlyTotalPaymentDouble = result.SumOfWorkshopsPaymentDouble + tenPercent; - result.MonthlyTotalPaymentStr = result.MonthlyTotalPaymentDouble.ToMoney(); - var installmentList = new List(); + //مبلغ بدون مالیات + result.MonthlyWithoutTaxPaymentDouble = result.SumOfWorkshopsPaymentDouble; + result.MonthlyWithoutTaxPaymentStr = result.SumOfWorkshopsPaymentDouble.ToMoney(); - var startDate = (DateTime.Now).ToFarsi(); + // مبلغ با مالیات + result.MonthlyTotalPaymentDouble = result.SumOfWorkshopsPaymentDouble + tenPercent; + result.MonthlyTotalPaymentStr = result.MonthlyTotalPaymentDouble.ToMoney(); + var installmentList = new List(); - if (periodModel == "1") - { + var startDate = (DateTime.Now).ToFarsi(); + result.ContractStartCurrentMonthFa = $"{startDate.Substring(0, 8)}01"; + result.ContractStartCurrentMonthGr = result.ContractStartCurrentMonthFa.ToGeorgianDateTime(); + startDate = result.ContractStartCurrentMonthFa; - installmentList.Add(new MonthlyInstallment() - { - InstallmentAmountStr = result.MonthlyTotalPaymentStr, - InstallmentCounter = "قسط شماره یک", - InstalmentDate = startDate + result.ContractStartNextMonthGr = ((startDate.FindeEndOfMonth()).ToGeorgianDateTime()).AddDays(1); + result.ContractStartNextMonthFa = result.ContractStartNextMonthGr.ToFarsi(); - }); - result.MonthlyInstallments = installmentList; - } - else - { - int instalmentCount = Convert.ToInt32(periodModel); - var instalmentAmount = result.MonthlyTotalPaymentDouble / instalmentCount; - var findEndOfMonth = startDate.FindeEndOfMonth(); - for (int i = 1; i <= instalmentCount; i++) - { - if (i > 1) - { - var currentMonthStart = ((findEndOfMonth.ToGeorgianDateTime()).AddDays(1)).ToFarsi(); - startDate = currentMonthStart.FindeEndOfMonth(); - findEndOfMonth = startDate; - } + if (contractStartType == "nextMonth") + startDate = result.ContractStartNextMonthFa; - installmentList.Add(new MonthlyInstallment() - { - InstallmentAmountStr = instalmentAmount.ToMoney(), - InstallmentCounter = i switch - { - 1 => "قسط شماره یک", - 2 => "قسط شماره دو", - 3 => "قسط شماره سه", - 4 => "قسط شماره چهار", - 5 => "قسط شماره پنج", - 6 => "قسط شماره شش", - 7 => "قسط شماره هفت", - 8 => "قسط شماره هشت", - 9 => "قسط شماره نه", - 10 => "قسط شماره ده", - 11 => "قسط شماره یازده", - 12 => "قسط شماره دوازده", - _ => "قسط شماره دوازده", - }, - InstalmentDate = startDate - }); - } - } + var findeEnd = Tools.FindEndOfContract(startDate, periodModel); + var contractEndDate = findeEnd.endDateGr; + result.ContractEndGr = contractEndDate; + result.ContractEndFa = contractEndDate.ToFarsi(); + + if (periodModel == "1") + { + + installmentList.Add(new MonthlyInstallment() + { + InstallmentAmountStr = result.MonthlyTotalPaymentStr, + InstallmentCounter = "سررسید پرداخت اول", + InstalmentDate = (DateTime.Now).ToFarsi() + + }); + result.MonthlyInstallments = installmentList; + } + else + { + int instalmentCount = Convert.ToInt32(periodModel); + var instalmentAmount = result.MonthlyTotalPaymentDouble / instalmentCount; + var findEndOfMonth = startDate.FindeEndOfMonth(); + for (int i = 1; i <= instalmentCount; i++) + { + if (i > 1) + { + var currentMonthStart = ((findEndOfMonth.ToGeorgianDateTime()).AddDays(1)).ToFarsi(); + startDate = currentMonthStart.FindeEndOfMonth(); + findEndOfMonth = startDate; + } + + installmentList.Add(new MonthlyInstallment() + { + InstallmentAmountStr = instalmentAmount.ToMoney(), + InstallmentCounter = i switch + { + 1 => "سررسید پرداخت اول", + 2 => "سررسید پرداخت دوم", + 3 => "سررسید پرداخت سوم", + 4 => "سررسید پرداخت چهارم", + 5 => "سررسید پرداخت پنجم", + 6 => "سررسید پرداخت ششم", + 7 => "سررسید پرداخت هفتم", + 8 => "سررسید پرداخت هشتم", + 9 => "سررسید پرداخت نهم", + 10 => "سررسید پرداخت دهم", + 11 => "سررسید پرداخت یازدهم", + 12 => "سررسید پرداخت دوازدهم", + _ => "سررسید پرداخت دوازدهم", + }, + InstalmentDate = startDate + + }); + } + + } #endregion - + result.MonthlyInstallments = installmentList; result.ContractingPartTempId = contractingPartyTempId; - return result; + return result; - } + } - /// - /// ایجاد یا ویرایش قرارداد موقت - /// - /// - /// - public async Task CreateOrUpdateInstitutionContractTemp(long contractingPartyTempId, string periodModel, string paymentModel, double totalPayment, double valueAddedTax) - { - - var op = new OperationResult(); - var institutionContractTemp = await - _institutionContractTempRepository.GetInstitutionContractTemp(0, contractingPartyTempId); - - if (institutionContractTemp == null) - { - var periodModelInt = Convert.ToInt32(periodModel); - var contractstart = DateTime.Now; - var contractEnd = DateTime.Now.AddMonths(periodModelInt); - var create = new InstitutionContractTemp(contractingPartyTempId, paymentModel, periodModel, totalPayment, contractstart, contractEnd, "official", valueAddedTax, "", "BeforeSendVerifyCode", 0, null, null); - _institutionContractTempRepository.Create(create); - _institutionContractTempRepository.SaveChanges(); - return op.Succcedded(); - } - else - { - if (institutionContractTemp.VerifyCodeEndTime != null) - { - var spaning = (DateTime.Now - institutionContractTemp.VerifyCodeEndTime.Value ); - if (institutionContractTemp.RegistrationStatus == "VerifyCodeSent" && spaning > new TimeSpan(0, 0, 0) && spaning < new TimeSpan(0, 1, 0)) - return op.Failed("شما به تازگی پیامک دریافت نموده اید دو دقیقه صبر کنید و دوباره تلاش کنید"); - } - - if (institutionContractTemp.RegistrationStatus == "Completed") - return op.Failed("شما قبلا ثبت نام خود را تکمیل نموده اید"); - - - var periodModelInt = Convert.ToInt32(periodModel); - var contractstart = DateTime.Now; - var contractEnd = DateTime.Now.AddMonths(periodModelInt); - var update = _institutionContractTempRepository.Get(institutionContractTemp.Id); - update.Edit(contractingPartyTempId, paymentModel, periodModel, totalPayment, contractstart, contractEnd, "official", valueAddedTax, "", "BeforeSendVerifyCode", 0, null, null); - _institutionContractTempRepository.SaveChanges(); - return op.Succcedded(); - } - - - } - - - /// - /// دریافت کد برای کلاینت - /// از طرف سرور - /// - /// - /// - public async Task ReceivedCodeFromServer(long contractingPartyTempId) - { + /// + /// ایجاد یا ویرایش قرارداد موقت + /// + /// + /// + public async Task CreateOrUpdateInstitutionContractTemp(long contractingPartyTempId, string periodModel, string paymentModel, double totalPayment, double valueAddedTax, DateTime contractStart) + { var op = new OperationResult(); - var institutionContractTemp = await + var institutionContractTemp = await + _institutionContractTempRepository.GetInstitutionContractTemp(0, contractingPartyTempId); + var contractStartDate = contractStart; + string contractStartFa = contractStart.ToFarsi(); + var findeEnd = Tools.FindEndOfContract(contractStartFa, periodModel); + var contractEndDate = findeEnd.endDateGr; + if (institutionContractTemp == null) + { + var periodModelInt = Convert.ToInt32(periodModel); + + var create = new InstitutionContractTemp(contractingPartyTempId, paymentModel, periodModel, totalPayment, contractStartDate, contractEndDate, "official", valueAddedTax, "", "BeforeSendVerifyCode", 0, null, null); + _institutionContractTempRepository.Create(create); + _institutionContractTempRepository.SaveChanges(); + return op.Succcedded(); + } + else + { + if (institutionContractTemp.VerifyCodeEndTime != null) + { + var spaning = (DateTime.Now - institutionContractTemp.VerifyCodeEndTime.Value); + if (institutionContractTemp.RegistrationStatus == "VerifyCodeSent" && spaning > new TimeSpan(0, 0, 0) && spaning < new TimeSpan(0, 1, 0)) + return op.Failed("شما به تازگی پیامک دریافت نموده اید دو دقیقه صبر کنید و دوباره تلاش کنید"); + } + + if (institutionContractTemp.RegistrationStatus == "Completed") + return op.Failed("شما قبلا ثبت نام خود را تکمیل نموده اید"); + + + var periodModelInt = Convert.ToInt32(periodModel); + var contractstart = DateTime.Now; + var contractEnd = DateTime.Now.AddMonths(periodModelInt); + var update = _institutionContractTempRepository.Get(institutionContractTemp.Id); + update.Edit(contractingPartyTempId, paymentModel, periodModel, totalPayment, contractStartDate, contractEndDate, "official", valueAddedTax, "", "BeforeSendVerifyCode", 0, null, null); + _institutionContractTempRepository.SaveChanges(); + return op.Succcedded(); + } + + + } + + + /// + /// دریافت کد برای کلاینت + /// از طرف سرور + /// + /// + /// + public async Task ReceivedCodeFromServer(long contractingPartyTempId) + { + + var op = new OperationResult(); + var institutionContractTemp = await _institutionContractTempRepository.GetInstitutionContractTemp(0, contractingPartyTempId); if (institutionContractTemp == null) return op.Failed("خطا"); - var update = _institutionContractTempRepository.Get(institutionContractTemp.Id); + var update = _institutionContractTempRepository.Get(institutionContractTemp.Id); - if (institutionContractTemp.RegistrationStatus == "BeforeSendVerifyCode") - { - //ساخت کد شش رقمی - Random generator = new Random(); - String code = generator.Next(1, 1000000).ToString("D6"); - //ارسال اس ام اس - var getContractingPaty = _contractingPartyTempRepository.GetByContractingPartyTempId(contractingPartyTempId); - var sendResult = await _smsService.SendVerifyCodeToClient(getContractingPaty.Phone, code); + if (institutionContractTemp.RegistrationStatus == "BeforeSendVerifyCode") + { + //ساخت کد شش رقمی + Random generator = new Random(); + String code = generator.Next(1, 1000000).ToString("D6"); + //ارسال اس ام اس + var getContractingPaty = _contractingPartyTempRepository.GetByContractingPartyTempId(contractingPartyTempId); + var sendResult = await _smsService.SendVerifyCodeToClient(getContractingPaty.Phone, code); - if (!sendResult.IsSuccedded) - return op.Failed($"{sendResult.Message}"); + if (!sendResult.IsSuccedded) + return op.Failed($"{sendResult.Message}"); - //ذخیره کد در دیتا بیس - //ذخیره تاریخ ارسال و مهلت پایان - //ذخیره آیدی پیامک - //تغییر وضعیت به ارسال شده - if (update != null) - { - update.Update(code, "VerifyCodeSent", sendResult.MessageId, DateTime.Now, DateTime.Now.AddMinutes(2)); - _institutionContractTempRepository.SaveChanges(); - return op.Succcedded(1, "کد برای شما پیامک شد"); - } + //ذخیره کد در دیتا بیس + //ذخیره تاریخ ارسال و مهلت پایان + //ذخیره آیدی پیامک + //تغییر وضعیت به ارسال شده + if (update != null) + { + update.Update(code, "VerifyCodeSent", sendResult.MessageId, DateTime.Now, DateTime.Now.AddMinutes(2)); + _institutionContractTempRepository.SaveChanges(); + return op.Succcedded(1, "کد برای شما پیامک شد"); + } - } + } - if (institutionContractTemp.RegistrationStatus == "VerifyCodeSent") + if (institutionContractTemp.RegistrationStatus == "VerifyCodeSent") - { + { - if(DateTime.Now < institutionContractTemp.VerifyCodeEndTime.Value) - return op.Failed("کد دریافت شده را وارد کنید"); - var spaning = (DateTime.Now - institutionContractTemp.VerifyCodeEndTime.Value); - if ((spaning > new TimeSpan(0, 0, 0) && spaning < new TimeSpan(0, 1, 0))) - return op.Failed("شما به تازگی پیامک دریافت نموده اید دو دقیقه صبر کنید و دوباره تلاش کنید"); + if (DateTime.Now < institutionContractTemp.VerifyCodeEndTime.Value) + return op.Failed("کد دریافت شده را وارد کنید"); + var spaning = (DateTime.Now - institutionContractTemp.VerifyCodeEndTime.Value); + if ((spaning > new TimeSpan(0, 0, 0) && spaning < new TimeSpan(0, 1, 0))) + return op.Failed("شما به تازگی پیامک دریافت نموده اید دو دقیقه صبر کنید و دوباره تلاش کنید"); - if ((spaning > new TimeSpan(0, 1, 0))) - { - //ساخت کد شش رقمی - Random generator = new Random(); - String code = generator.Next(1, 1000000).ToString("D6"); - //ارسال اس ام اس - var getContractingPaty = _contractingPartyTempRepository.GetByContractingPartyTempId(contractingPartyTempId); - var sendResult = await _smsService.SendVerifyCodeToClient(getContractingPaty.Phone, code); + if ((spaning > new TimeSpan(0, 1, 0))) + { + //ساخت کد شش رقمی + Random generator = new Random(); + String code = generator.Next(1, 1000000).ToString("D6"); + //ارسال اس ام اس + var getContractingPaty = _contractingPartyTempRepository.GetByContractingPartyTempId(contractingPartyTempId); + var sendResult = await _smsService.SendVerifyCodeToClient(getContractingPaty.Phone, code); - if (!sendResult.IsSuccedded) - return op.Failed($"{sendResult.Message}"); + if (!sendResult.IsSuccedded) + return op.Failed($"{sendResult.Message}"); - //ذخیره کد در دیتا بیس - //ذخیره تاریخ ارسال و مهلت پایان - //ذخیره آیدی پیامک - //تغییر وضعیت به ارسال شده + //ذخیره کد در دیتا بیس + //ذخیره تاریخ ارسال و مهلت پایان + //ذخیره آیدی پیامک + //تغییر وضعیت به ارسال شده - if (update != null) - { - update.Update(code, "VerifyCodeSent", sendResult.MessageId, DateTime.Now, DateTime.Now.AddMinutes(2)); - _institutionContractTempRepository.SaveChanges(); - return op.Succcedded(1, "کد برای شما پیامک شد"); - } + if (update != null) + { + update.Update(code, "VerifyCodeSent", sendResult.MessageId, DateTime.Now, DateTime.Now.AddMinutes(2)); + _institutionContractTempRepository.SaveChanges(); + return op.Succcedded(1, "کد برای شما پیامک شد"); + } - } + } - } + } - //if (institutionContractTemp.RegistrationStatus == "ReceivedCodeFromClient") - // return op.Succcedded(2, "انتقال به بخش پرداخت"); + //if (institutionContractTemp.RegistrationStatus == "ReceivedCodeFromClient") + // return op.Succcedded(2, "انتقال به بخش پرداخت"); - if (institutionContractTemp.RegistrationStatus == "Completed") - return op.Failed("شما قبلا ثبت نام خود را تکمیل نموده اید"); - return op.Failed("خظا"); - } + if (institutionContractTemp.RegistrationStatus == "Completed") + return op.Failed("شما قبلا ثبت نام خود را تکمیل نموده اید"); + return op.Failed("خظا"); + } - /// - /// ورود کد از طرف کلاینت - /// برا چک کردن - /// - /// - /// - /// - public async Task CheckVerifyCodeIsTrue(long contractingPartyTempId, string verifyCode) - { - var op = new OperationResult(); - var institutionContractTemp = await - _institutionContractTempRepository.GetInstitutionContractTemp(0, contractingPartyTempId); - if (institutionContractTemp == null) - return op.Failed("خظا"); - if (institutionContractTemp.RegistrationStatus != "VerifyCodeSent") - return op.Failed("خطا"); + /// + /// ورود کد از طرف کلاینت + /// برا چک کردن + /// + /// + /// + /// + public async Task CheckVerifyCodeIsTrue(long contractingPartyTempId, string verifyCode) + { + var op = new OperationResult(); + var institutionContractTemp = await + _institutionContractTempRepository.GetInstitutionContractTemp(0, contractingPartyTempId); + if (institutionContractTemp == null) + return op.Failed("خظا"); + if (institutionContractTemp.RegistrationStatus != "VerifyCodeSent") + return op.Failed("خطا"); - if (institutionContractTemp.VerifyCodeEndTime < DateTime.Now) - return op.Failed("کد شما منقضی شده است"); + if (institutionContractTemp.VerifyCodeEndTime < DateTime.Now) + return op.Failed("کد شما منقضی شده است"); - if (institutionContractTemp.SendVerifyCodeTime < DateTime.Now && institutionContractTemp.VerifyCodeEndTime >= DateTime.Now) - { - if (institutionContractTemp.VerifyCode == verifyCode) - { + if (institutionContractTemp.SendVerifyCodeTime < DateTime.Now && institutionContractTemp.VerifyCodeEndTime >= DateTime.Now) + { + if (institutionContractTemp.VerifyCode == verifyCode) + { - return op.Succcedded(); - } - else - { - return op.Failed("کد وارد شده صحیح نیست"); - } + return op.Succcedded(); + } + else + { + return op.Failed("کد وارد شده صحیح نیست"); + } - } + } - return op.Failed("کد وارد شده صحیح نیست"); - } + return op.Failed("کد وارد شده صحیح نیست"); + } - /// - /// تکمیل پرداخت - /// - /// - /// - /// - public async Task PayOffCompleted(long contractingPartyTempId) - { - var op = new OperationResult(); - return op.Succcedded(); - } + /// + /// تکمیل پرداخت + /// + /// + /// + /// + public async Task PayOffCompleted(long contractingPartyTempId) + { + var op = new OperationResult(); + return op.Succcedded(); + } } \ No newline at end of file diff --git a/ServiceHost/Pages/Register/Index.cshtml.cs b/ServiceHost/Pages/Register/Index.cshtml.cs index 4e2e0d74..41dfc6c9 100644 --- a/ServiceHost/Pages/Register/Index.cshtml.cs +++ b/ServiceHost/Pages/Register/Index.cshtml.cs @@ -66,9 +66,9 @@ namespace ServiceHost.Pages.register } - public async Task OnGetTotalPaymentAndWorkshopList(long contractingPartyTempId, string periodModel = "12", string paymentModel = "OneTime") + public async Task OnGetTotalPaymentAndWorkshopList(long contractingPartyTempId, string periodModel = "12", string paymentModel = "OneTime", string contractStartType = "currentMonth") { - var result = await _temporaryClientRegistrationApplication.GetTotalPaymentAndWorkshopList(contractingPartyTempId, periodModel, paymentModel); + var result = await _temporaryClientRegistrationApplication.GetTotalPaymentAndWorkshopList(contractingPartyTempId, periodModel, paymentModel, contractStartType); return new JsonResult(new { data = result, @@ -87,9 +87,9 @@ namespace ServiceHost.Pages.register } - public async Task OnPostCreateOrUpdateInstitutionContractTemp(long contractingPartyTempId, string periodModel, string paymentModel, double totalPayment, double valueAddedTax) + public async Task OnPostCreateOrUpdateInstitutionContractTemp(long contractingPartyTempId, string periodModel, string paymentModel, double totalPayment, double valueAddedTax, DateTime contractStart) { - var result = await _temporaryClientRegistrationApplication.CreateOrUpdateInstitutionContractTemp(contractingPartyTempId, periodModel, paymentModel, totalPayment, valueAddedTax); + var result = await _temporaryClientRegistrationApplication.CreateOrUpdateInstitutionContractTemp(contractingPartyTempId, periodModel, paymentModel, totalPayment, valueAddedTax, contractStart); return new JsonResult(new { success = result.IsSuccedded, diff --git a/ServiceHost/Pages/Register/_Partials/_Step4.cshtml b/ServiceHost/Pages/Register/_Partials/_Step4.cshtml index b205d28a..ee144b89 100644 --- a/ServiceHost/Pages/Register/_Partials/_Step4.cshtml +++ b/ServiceHost/Pages/Register/_Partials/_Step4.cshtml @@ -6,7 +6,7 @@
-
+
@@ -16,75 +16,93 @@ پرداخت یکجا
-
مدت قرارداد
-
- - +
+
مدت قرارداد
+
+ + - - + + - - + + - - + + +
+
- +
+
+
+
+
+ + -
-
-
-
مجموع مبالغ:
-
-
-
-
-
ارزش افزوده:
-
-
- -
-
-
مبلغ قابل پرداخت:
-
-
- + + +
+
+ +
+
+
+
مجموع مبالغ:
+
-
+
+
+
ارزش افزوده:
+
-
+ +
+
+
مبلغ قابل پرداخت:
+
-
+ +
+
diff --git a/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step3.css b/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step3.css index 0a813e57..c64dc86a 100644 --- a/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step3.css +++ b/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step3.css @@ -32,8 +32,8 @@ .openBtnWP { background-color: #B6F2E1; - width: 25px; - height: 25px; + width: 30px; + height: 30px; border-radius: 6px; } @@ -71,6 +71,36 @@ color: #0B5959; font-size: 18px; font-weight: 600; + width: 150px; + text-align: center; +} + +.totalPayCon { + display: flex; + justify-content: space-between; + align-items: center; + gap: 3px; +} + +.numberSpanInput { + width: 60px; + text-align: center; + direction: ltr; +} + +.errorString { + animation: shake 300ms; + color: #eb3434 !important; + display: none; + font-size: 12px; +} + +.orderCustom1 { + order: 1; +} + +.orderCustom2 { + order: 2; } .divider { @@ -85,9 +115,10 @@ .totalPaymentWP { color: #1ABA3D; - font-size: 19px; - font-weight: 800; + font-size: 18px; + font-weight: 600; text-align: end; + width: 150px; } .titleInfoWP { @@ -176,7 +207,7 @@ text-align: center; padding: 6px 9px; border-radius: 9px; - width: 160px; + width: 180px; transition: all 0.3s ease-in-out; cursor: pointer; -webkit-user-select: none; @@ -227,19 +258,13 @@ } - - - - - - - @media only screen and (max-width: 1366px) { /*.btnRadioContainer { grid-template-columns: repeat(2, minmax(0, 1fr)); }*/ .radioLabelListOption { - width: 134px; + width: 144px; + font-size: 10px; } .totalPayWP { @@ -255,7 +280,16 @@ @media only screen and (max-width: 1200px) { .btnRadioContainer { - grid-template-columns: repeat(3, minmax(0, 1fr)); + /*grid-template-columns: repeat(3, minmax(0, 1fr));*/ + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .orderCustom1 { + order: 2; + } + + .orderCustom2 { + order: 1; } .totalPayWP { @@ -264,7 +298,7 @@ } .radioLabelListOption { - width: 129px; + width: 145px; padding: 4px 6px; } } @@ -293,6 +327,7 @@ .totalPayWP { font-size: 13px; + width: 120px; } .totalPaymentWP { @@ -302,6 +337,38 @@ } } +@media only screen and (max-width: 625px) { + .workshopListItem .titleWP { + font-size: 11px; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + + .totalPayWP { + font-size: 11px; + width: 110px; + font-weight: 700; + display: none; + } + + .totalPaymentWP { + margin-top: 18px; + } + + .totalPayCon { + justify-content: center; + gap: 6px; + } + + .openBtnWP, + .btnRemove { + width: 25px; + height: 25px; + } +} + @@ -327,8 +394,6 @@ - - diff --git a/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step4.css b/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step4.css index cb3d7e76..08f40f3c 100644 --- a/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step4.css +++ b/ServiceHost/wwwroot/AssetsClient/pages/Register/css/_Partials/_Step4.css @@ -29,7 +29,7 @@ .cardHeight { - height: 50%; + height: 30vh; overflow: auto; } @@ -121,6 +121,9 @@ display: flex; flex-direction: column; gap: 9px; + height: 260px; + justify-content: space-between; + padding: 12px 9px; } .footerStep4Container .titleFooter { @@ -172,16 +175,20 @@ } -.infoPricesContainer { +.infoPricesContainerDiv { + height: 70px; + overflow: auto; padding: 6px; border: 1px solid #E7E7E7; - border-radius: 16px; background-color: #F5F5F5; + border-radius: 9px; +} + +.infoPricesContainer { display: grid; gap: 6px; - grid-template-columns: repeat(2, minmax(0, 1fr)); - height: 120px; - overflow: auto; + grid-auto-flow: column; + grid-template-rows: repeat(6, minmax(0, 1fr)); align-content: start; } @@ -243,7 +250,7 @@ } .infoPricesContainer { - grid-template-columns: repeat(1, minmax(0, 1fr)); + grid-template-rows: repeat(1, minmax(0, 1fr)); height: 130px; overflow: auto; } diff --git a/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step3.js b/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step3.js index 813f1524..e0c30caa 100644 --- a/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step3.js +++ b/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step3.js @@ -8,10 +8,10 @@ var workshopDataId = 0; $(document).ready(function () { var $inputs = $('.operations-btns input'); - $(".select2Option").select2({ - language: "fa", - dir: "rtl" - }); + // $(".select2Option").select2({ + // language: "fa", + // dir: "rtl" + //}); autoScroll(); }); @@ -22,21 +22,78 @@ function autoScroll() { }, 2500); } -$(document).on('input', '.operations-btns input[type="text"]', function() { - let $input = $(this); - let nameSpan = $input.closest(".accordion-item").find('.workshopListItem .workshopNameSpan'); - nameSpan.text($input.val()); +$(document).on('input', '.operations-btns .workshopName', function () { + let $input = $(this); + let nameSpan = $input.closest(".accordion-item").find('.workshopListItem .workshopNameSpan'); + nameSpan.text($input.val()); updateAddButtonText(); }); -$(document).on('change', ".operations-btns select", function () { +$(document).on('input', '.operations-btns .numberSpanInput', function () { let $input = $(this); - let numberSpan = $input.closest(".accordion-item").find('.workshopListItem .numberSpan'); - numberSpan.text($input.val()); + let value = $input.val().replace(/\D/g, ''); + $input.val(value); + + let number = parseInt(value, 10); + + if (isNaN(number) || number === 0) { + $input.addClass("errored"); + $('.errorString').show().text('عدد وارد شده نامعتبر است.'); + } else if (number > 2000) { + $input.addClass("errored"); + $('.errorString').show().text('تعداد وارد شده نباید بیشتر از ۲۰۰۰ باشد.'); + //$input.val('2000'); + } else if (number < 3) { + $input.addClass("errored"); + $('.errorString').show().text('تعداد وارد شده باید حداقل ۳ نفر باشد.'); + //$input.val('3'); + } else { + $('.errorString').hide().text(''); + $input.removeClass("errored"); + } + + let numberSpan = $input.closest(".accordion-item").find('.workshopListItem .numberSpan'); + numberSpan.text($input.val()); updateAddButtonText(); }); -$(document).on('change', '.btnRadioContainer .radioOption', updateAddButtonText); +$(document).on('change input', '.btnRadioContainer .radioOption', function () { + const accordionItem = $(this).closest('.accordion-item'); + const dataId = accordionItem.data('id'); + const dataIsNew = accordionItem.data('new'); + + // Services radio btn + const $contract = $(`#ContractAndCheckout${dataIsNew ? `_` : ''}${dataId}`); + const $contractAndCheckoutInPerson = $(`#ContractAndCheckoutInPerson${dataIsNew ? `_` : ''}${dataId}`); + const $insurance = $(`#Insurance${dataIsNew ? `_` : ''}${dataId}`); + const $insuranceInPerson = $(`#InsuranceInPerson${dataIsNew ? `_` : ''}${dataId}`); + const $rollCall = $(`#RollCall${dataIsNew ? `_` : ''}${dataId}`); + const $customize = $(`#CustomizeCheckout${dataIsNew ? `_` : ''}${dataId}`); + + if (!$contract.prop('checked')) { + $rollCall.prop('checked', false).prop('disabled', true).closest('div').find('label').addClass('disable'); + $customize.prop('checked', false).prop('disabled', true).closest('div').find('label').addClass('disable'); + $contractAndCheckoutInPerson.prop('checked', false).prop('disabled', false).closest('div').find('label').addClass('disable'); + } else { + $contractAndCheckoutInPerson.prop('checked', true).prop('disabled', false).closest('div').find('label').removeClass('disable'); + $rollCall.prop('disabled', false).closest('div').find('label').removeClass('disable'); + + if ($rollCall.prop('checked')) { + $customize.prop('disabled', false).closest('div').find('label').removeClass('disable'); + } else { + $customize.prop('checked', false).prop('disabled', true).closest('div').find('label').addClass('disable'); + } + } + + if (!$insurance.prop('checked')) { + $insuranceInPerson.prop('checked', false).prop('disabled', false).closest('div').find('label').addClass('disable'); + } else { + $insuranceInPerson.prop('checked', true).prop('disabled', false).closest('div').find('label').removeClass('disable'); + } + // Services radio btn + updateAddButtonText(); +}); +// $(document).on('change', '.btnRadioContainer .radioOption', updateAddButtonText); $(document).on("click", ".btnAdd", function () { let $currentWorkshop = $(".accordion-item").last(); @@ -44,7 +101,7 @@ $(document).on("click", ".btnAdd", function () { let allInputsFilled = true; let atLeastOneChecked = false; - $currentWorkshop.find('.operations-btns input[type="text"]').each(function () { + $currentWorkshop.find('.operations-btns input').each(function () { if ($(this).val().trim() === "") { allInputsFilled = false; validateField($(this), "ابتدا اطلاعات کارگاه را وارد نمائید", 3500); @@ -52,8 +109,8 @@ $(document).on("click", ".btnAdd", function () { } else { workshopName = $(this).val().trim(); } - }); - + }); + $currentWorkshop.find('.btnRadioContainer .radioOption').each(function () { if ($(this).prop('checked')) { atLeastOneChecked = true; @@ -72,55 +129,57 @@ function addNewWorkshop() { workshopDataId = workshopDataId + 1; var workshopHtml = `
-
- -
-
-
- 25 - نفر -
-
-
- - -
-
- -
- +
+
+ +
+
+ +
+
+
+ - + نفر +
+
+
+
-
+
+
+ +
+ +
-
+
نام مجموعه (کارگاه)
- +
تعداد پرسنل: - + +
@@ -138,23 +197,35 @@ function addNewWorkshop() {
-
+
- +
-
+
- +
+
+ + +
+
+ + +
-
-
- - -
+
+
+
+
+ - +
+
+
@@ -163,10 +234,10 @@ function addNewWorkshop() { $('.accordion').append(workshopHtml); - $(`.select2Option_new_${workshopDataId}`).select2({ - language: "fa", - dir: "rtl" - }); + //$(`.select2Option_new_${workshopDataId}`).select2({ + // language: "fa", + // dir: "rtl" + // }); $(".operations-btns").slideUp(300); $(".openBtnWP").removeClass('expanded'); @@ -220,13 +291,13 @@ function createOrUpdateCommand() { let selectedRollCall = false; let selectedCustomizeCheckout = false; let allInputsFilled = true; - let atLeastOneChecked = false; + let atLeastOneChecked = false; let workshopID = command.workshops.length; if (!allInputsFilled) return; - $currentWorkshop.find('.operations-btns input[type="text"]').each(function() { + $currentWorkshop.find('.operations-btns .workshopName').each(function() { if ($(this).val() === "") { allInputsFilled = false; validateField($(this), "ابتدا اطلاعات کارگاه را وارد نمائید", 3500); @@ -234,9 +305,17 @@ function createOrUpdateCommand() { } else { workshopName = $(this).val(); } + }); + + $currentWorkshop.find('.numberSpanInput').each(function () { + let val = parseInt($(this).val(), 10); + if (isNaN(val) || val === 0 || val < 3 || val > 2000) { + validateField($(this), "لطفا تعداد پرسنل را مشخص نمایید.", 3500); + return false; + } }); - personnelCount = parseInt($currentWorkshop.find(".operations-btns select").val()) || 0; + personnelCount = parseInt($currentWorkshop.find(".operations-btns .numberSpanInput").val()); function checkCheckbox(serviceName) { const selector = `.btnRadioContainer #${serviceName}${dataIsNew ? `_` : ''}${dataId}`; @@ -299,7 +378,8 @@ function createOrUpdateCommand() { function updateAddButtonText() { let allInputsFilled = true; - let atLeastOneChecked = false; + let atLeastOneChecked = false; + let allNumbersValid = true; $(".accordion-item").each(function () { let $workshop = $(this); @@ -307,7 +387,7 @@ function updateAddButtonText() { let isChecked = false; atLeastOneChecked = false; - $workshop.find('.operations-btns input[type="text"]').each(function () { + $workshop.find('.operations-btns .workshopName').each(function () { if ($(this).val().trim() === "") { isFilled = false; return false; @@ -321,12 +401,20 @@ function updateAddButtonText() { } }); + $workshop.find('.numberSpanInput').each(function () { + let val = parseInt($(this).val(), 10); + if (isNaN(val) || val === 0 || val < 3 || val > 2000) { + allNumbersValid = false; + return false; + } + }); + if (!isFilled) allInputsFilled = false; if (isChecked) atLeastOneChecked = true; }); - if (allInputsFilled && atLeastOneChecked) { + if (allInputsFilled && atLeastOneChecked && allNumbersValid) { $('.btnAdd').prop('disabled', false).removeClass('disable'); $('#nextStep3').prop('disabled', false).removeClass('disable'); } else { @@ -387,27 +475,38 @@ function updateRemoveButtons() { $(".btnRemove").last().prop('disabled', false).removeClass("disable"); } -$(document).on('change', '.operations-btns select, .btnRadioContainer .radioOption', function () { +// Get Amounts for a Workshop service +$(document).on('change input', '.operations-btns .numberSpanInput, .btnRadioContainer .radioOption', function () { const accordionItem = $(this).closest('.accordion-item'); const dataId = accordionItem.data('id'); const dataIsNew = accordionItem.data('new'); const $totalPayment = $(`#totalPayment_${dataId}`); const $totalPay = $(`#totalPay_${dataId}`); - + const personnelCount = parseInt($(`#numberPersonnel${dataIsNew ? `_` : ''}${dataId}`).val()) || 0; if (personnelCount === 0) { let existingSumAmount = sumAmountArray.find(w => w.workshopDataId === dataId); if (existingSumAmount) { sumAmountArray = sumAmountArray.filter(w => w.workshopDataId !== dataId); - } + } sumNumberOfAmount(); - $totalPayment.text('-'); - $totalPay.text('-'); + $totalPayment.addClass('justify-content-center').text('-'); + $totalPay.addClass('justify-content-center').text('-'); return; - } + } else if (personnelCount > 2000) { + sumNumberOfAmount(); + $totalPayment.addClass('justify-content-center').text('-'); + $totalPay.addClass('justify-content-center').text('-'); + return; + } else if (personnelCount < 3) { + sumNumberOfAmount(); + $totalPayment.addClass('justify-content-center').text('-'); + $totalPay.addClass('justify-content-center').text('-'); + return; + } - const serviceKeys = ['ContractAndCheckout', 'Insurance', 'RollCall', 'CustomizeCheckout']; + const serviceKeys = ['ContractAndCheckout', 'Insurance', 'RollCall', 'CustomizeCheckout', 'ContractAndCheckoutInPerson', 'InsuranceInPerson']; const selectedOptions = {}; let atLeastOneChecked = false; serviceKeys.forEach(key => { @@ -416,25 +515,26 @@ $(document).on('change', '.operations-btns select, .btnRadioContainer .radioOpti if (isChecked) atLeastOneChecked = true; }); + if (!atLeastOneChecked) { let existingSumAmount = sumAmountArray.find(w => w.workshopDataId === dataId); if (existingSumAmount) { sumAmountArray = sumAmountArray.filter(w => w.workshopDataId !== dataId); } sumNumberOfAmount(); - $totalPayment.text('-'); - $totalPay.text('-'); + $totalPayment.addClass('justify-content-center').text('-'); + $totalPay.addClass('justify-content-center').text('-'); return; } var newWorkshopGetAmountCommand = { CountPerson: personnelCount, ...selectedOptions - }; - + }; + ajax.get(institutionPlanForWorkshopUrl, newWorkshopGetAmountCommand, false) .then(response => { - const amountStr = response.data.onlineAndInPersonSumAmountStr + ' ریال'; + const amountStr = response.data.onlineAndInPersonSumAmountStr; const amountDouble = response.data.onlineAndInPersonSumAmountDouble || 0; let existingSumAmount = sumAmountArray.find(w => w.workshopDataId === dataId); if (existingSumAmount) { @@ -449,10 +549,10 @@ $(document).on('change', '.operations-btns select, .btnRadioContainer .radioOpti sumAmountArray.push(newSumAmount); } - sumNumberOfAmount(); - $(`#totalPayment_${dataId}`).text(amountStr); - $(`#totalPay_${dataId}`).text(amountStr); - + sumNumberOfAmount(); + + $(`#totalPayment_${dataId}`).removeClass('justify-content-center').html(`${amountStr} ریال`); + $(`#totalPay_${dataId}`).removeClass('justify-content-center').html(`${amountStr} ریال`); }); }); @@ -466,6 +566,7 @@ function sumNumberOfAmount() { var formatted = formatNumber(sumAllAmount); $('#totalSumDisplay').text(formatted + ' ریال'); } + function formatNumber(number) { return Math.round(number) .toString() @@ -478,62 +579,69 @@ function loadWorkshopData(id) { workshops: [] }; sumAmountArray = []; + //$('#accordionHtml').html(''); ajax.get(getWorkshopTempUrl, { contractingPartyId: id }, true) - .then(response => { + .then(response => { if (response.data.length > 0) { - response.data.forEach(function(item, index) { + response.data.forEach(function (item, index) { + html += `
-
- ${item.workshopName} -
+ +
+
+ ${item.workshopName} +
+
-
-
- ${item.countPerson} - نفر -
-
-
- ${item.workshopServicesAmountStr} ریال -
-
- -
- -
+
+
+
+ ${item.countPerson} + نفر +
+
+
+
+ ${item.workshopServicesAmountStr} + ریال +
+
+
+ +
+ +
+
-
+
نام مجموعه (کارگاه)
- +
تعداد پرسنل: - + +
@@ -551,29 +659,45 @@ function loadWorkshopData(id) {
-
+
-
+
+
+ + +
+
+ + +
-
-
- ${item.workshopServicesAmountStr} -
+
+
+
+
+ ${item.workshopServicesAmountStr} + ریال +
+
+
`; - - var itemOfWorkshops = { + + //$('#accordionHtml').html(html); + //loadRadioChecked(item.id); + + var itemOfWorkshops = { Id: item.id, workshopId: item.id, WorkshopName: item.workshopName, @@ -596,36 +720,44 @@ function loadWorkshopData(id) { amount: item.workshopServicesAmount }; sumAmountArray.push(itemOfAmount); - }); + + }); } else { html += `
-
- + +
+
+ +
-
-
- 25 - نفر -
-
-
- - -
-
- -
- +
+
+
+ - + نفر +
+
+
+
-
+
+
+ +
+ +
@@ -636,19 +768,14 @@ function loadWorkshopData(id) {
نام مجموعه (کارگاه)
- +
تعداد پرسنل: - + +
@@ -666,23 +793,35 @@ function loadWorkshopData(id) {
-
+
-
+
+
+ + +
+
+ + +
-
- - -
+
+
+
+ - +
+
+
@@ -693,19 +832,55 @@ function loadWorkshopData(id) { if (command.workshops.length > 0) { command.workshops.forEach(function(item) { - $(`#numberPersonnel${item.Id}`).select2(); - $(`#numberPersonnel${item.Id}`).val(item.CountPerson).trigger('change'); + //$(`#numberPersonnel${item.Id}`).select2(); + //$(`#numberPersonnel${item.Id}`).val(item.CountPerson).trigger('change'); + $(`#numberPersonnel${item.Id}`).val(item.CountPerson); }); } else { - $(`#numberPersonnel_new_0`).select2(); - $(`#numberPersonnel_new_0`).val("25").trigger('change'); + //$(`#numberPersonnel_new_0`).select2(); + //$(`#numberPersonnel_new_0`).val("25").trigger('change'); + $(`#numberPersonnel_new_0`).val(""); } // console.log(command.workshops); // console.log(sumAmountArray); sumNumberOfAmount(); + autoScroll(); + loadRadioChecked(); + updateAddButtonText(); + function loadRadioChecked() { + if (command.workshops.length > 0) { + command.workshops.forEach(function (item) { + let $contract = $(`#ContractAndCheckout${item.Id}`); + let $contractAndCheckoutInPerson = $(`#ContractAndCheckoutInPerson${item.Id}`); + let $insurance = $(`#Insurance${item.Id}`); + let $insuranceInPerson = $(`#InsuranceInPerson${item.Id}`); + let $rollCall = $(`#RollCall${item.Id}`); + let $customize = $(`#CustomizeCheckout${item.Id}`); - autoScroll(); + if (!$contract.prop('checked')) { + $rollCall.prop('checked', false).prop('disabled', true).closest('div').find('label').addClass('disable'); + $customize.prop('checked', false).prop('disabled', true).closest('div').find('label').addClass('disable'); + $contractAndCheckoutInPerson.prop('checked', false).prop('disabled', false).closest('div').find('label').addClass('disable'); + } else { + $contractAndCheckoutInPerson.prop('checked', true).prop('disabled', false).closest('div').find('label').removeClass('disable'); + $rollCall.prop('disabled', false).closest('div').find('label').removeClass('disable'); + + if ($rollCall.prop('checked')) { + $customize.prop('disabled', false).closest('div').find('label').removeClass('disable'); + } else { + $customize.prop('checked', false).prop('disabled', true).closest('div').find('label').addClass('disable'); + } + } + + if (!$insurance.prop('checked')) { + $insuranceInPerson.prop('checked', false).prop('disabled', false).closest('div').find('label').addClass('disable'); + } else { + $insuranceInPerson.prop('checked', true).prop('disabled', false).closest('div').find('label').removeClass('disable'); + } + }); + } + } }); } \ No newline at end of file diff --git a/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step4.js b/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step4.js index 2b89c034..d247aa3f 100644 --- a/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step4.js +++ b/ServiceHost/wwwroot/AssetsClient/pages/Register/js/_Partials/_Step4.js @@ -1,10 +1,16 @@ $(document).ready(function () { - $('input[name="radMonth"]').on('change', function () { totalPaymentAndWorkshopList(); }); - $('input[name="radMonth"]:checked').trigger('change'); + $('input[name="radMonth"]:checked').trigger('change'); + + + $('input[name="radFinanceContract"]').on('change', function () { + totalPaymentAndWorkshopList(); + }); + + $('input[name="radFinanceContract"]:checked').trigger('change'); }); function autoScrollStep4() { @@ -15,13 +21,14 @@ function autoScrollStep4() { async function loadSpecifiedWorkshop(data) { var html = ''; - + + if (data.workshops.length > 0) { data.workshops.forEach(function(item) { html += `
نام کارگاه : ${item.WorkshopName}
-
ریال ${item.WorkshopServicesAmountStr}
+
${item.WorkshopServicesAmountStr} ریال
@@ -101,10 +108,28 @@ async function totalPaymentAndWorkshopList() { } var hasPriceStatic = $('#priceStatic').hasClass('active'); - - ajax.get(totalPaymentAndWorkshopListUrl, { contractingPartyTempId: parseInt($('#contractPartyId').val()) || 0, periodModel: months }) + var selectedRadFinanceContract = $('input[name="radFinanceContract"]:checked').val(); + var financeContract = ""; + + switch (selectedRadFinanceContract) { + case 'currentMonth': + financeContract = 'currentMonth'; + break; + case 'nextMonth': + financeContract = 'nextMonth'; + break; + } + + ajax.get(totalPaymentAndWorkshopListUrl, + { + contractingPartyTempId: parseInt($('#contractPartyId').val()) || 0, + periodModel: months, + contractStartType: financeContract + }) .then(response => { + // console.log(response.data); + if (hasPriceStatic) { $(`#sumOfWorkshopsPaymentPayment`).text(response.data.oneTimeWithoutTaxPaymentStr + " ریال"); $(`#totalPaymentStr`).text(response.data.oneTimeTotalPaymentStr + " ریال"); @@ -128,7 +153,7 @@ async function totalPaymentAndWorkshopList() { $(`#totalPaymentDoubleInput`).val(hasPriceStatic ? response.data.oneTimeTotalPaymentDouble : response.data.monthlyTotalPaymentDouble); $(`#valueAddedTaxDoubleInput`).val(response.data.valueAddedTaxDouble); - $('#priceStepContainer').html(''); + $('#priceStepContainerHtml').html(''); if (response.data.monthlyInstallments) { response.data.monthlyInstallments?.forEach(function (item) { var html = ` @@ -138,10 +163,23 @@ async function totalPaymentAndWorkshopList() {
${item.installmentAmountStr} ریال
`; - $('#priceStepContainer').append(html); + $('#priceStepContainerHtml').append(html); }); - } + } + + $('#ContractStartMonthView').text( + $('#contractStartCurrentMonthFa').prop('checked') + ? response.data.contractStartCurrentMonthFa + : response.data.contractStartNextMonthFa + ); + + $('#ContractStartMonthGr').val( + $('#contractStartCurrentMonthFa').prop('checked') + ? response.data.contractStartCurrentMonthGr + : response.data.contractStartNextMonthGr + ); }); + } //$(document).on('change', '.btnCheckContainer .checkOption', createOrUpdateCommand); @@ -166,6 +204,19 @@ async function checkInputsStep4() { case 'twelveMonth': months = 12; break; + } + + + var selectedRadFinanceContract = $('input[name="radFinanceContract"]:checked').val(); + var financeContract = ""; + + switch (selectedRadFinanceContract) { + case 'currentMonth': + financeContract = 'currentMonth'; + break; + case 'nextMonth': + financeContract = 'nextMonth'; + break; } var priceMethod = $('#priceStatic').hasClass('active') ? "OneTime" : "Monthly"; @@ -176,6 +227,7 @@ async function checkInputsStep4() { contractingPartyTempId: parseInt($('#contractPartyId').val()) || 0, periodModel: months, paymentModel: priceMethod, + contractStart: $('#ContractStartMonthGr').val(), totalPayment: Number($('#totalPaymentDoubleInput').val()), valueAddedTax: Number($('#valueAddedTaxDoubleInput').val()) }, true); @@ -216,13 +268,7 @@ $('#priceStatic').on('click', function () { $('#priceStepContainer').hide(); $('#priceStep').removeClass('active'); $(this).addClass('active'); - - if ($(this).hasClass("active")) { - $(".cardHeight").css("height", "50%"); - } else { - $(".cardHeight").css("height", "39%"); - } - + totalPaymentAndWorkshopList(); }); @@ -231,12 +277,6 @@ $('#priceStep').on('click', function () { $('#priceStatic').removeClass('active'); $(this).addClass('active'); - if ($(this).hasClass("active")) { - $(".cardHeight").css("height", "39%"); - } else { - $(".cardHeight").css("height", "50%"); - } - totalPaymentAndWorkshopList(); });