diff --git a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs index 20627991..d1ebe6dd 100644 --- a/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs +++ b/Company.Domain/InstitutionContractAgg/IInstitutionContractRepository.cs @@ -65,11 +65,13 @@ public interface IInstitutionContractRepository : IRepository GetAmendmentWorkshops(long institutionContractId); Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request); + Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request); + Task RemoveAmendmentWorkshops(Guid workshopTempId); #endregion Task> GetInstitutionContractSelectList(string search, string selected); diff --git a/Company.Domain/InstitutionContractAgg/InstitutionContract.cs b/Company.Domain/InstitutionContractAgg/InstitutionContract.cs index 3984f44a..84535d30 100644 --- a/Company.Domain/InstitutionContractAgg/InstitutionContract.cs +++ b/Company.Domain/InstitutionContractAgg/InstitutionContract.cs @@ -6,7 +6,6 @@ using System.Security.Cryptography; using _0_Framework.Domain; using Company.Domain.InstitutionContractContactInfoAgg; using CompanyManagment.App.Contracts.InstitutionContract; -using OfficeOpenXml.Table.PivotTable; namespace Company.Domain.InstitutionContractAgg; diff --git a/Company.Domain/InstitutionContractAmendmentTempAgg/InstitutionContractAmendmentTemp.cs b/Company.Domain/InstitutionContractAmendmentTempAgg/InstitutionContractAmendmentTemp.cs new file mode 100644 index 00000000..bac4cd56 --- /dev/null +++ b/Company.Domain/InstitutionContractAmendmentTempAgg/InstitutionContractAmendmentTemp.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Company.Domain.InstitutionContractAmendmentTempAgg; + +public class InstitutionContractAmendmentTemp +{ + public InstitutionContractAmendmentTemp(List prevWorkshops, + long institutionContractId) + { + Id = Guid.NewGuid(); + PrevWorkshops = prevWorkshops; + NewWorkshops = prevWorkshops.Select(x=> new InstitutionContractAmendmentTempNewWorkshop( + x.WorkshopName, x.CountPerson, x.ContractAndCheckout, x.ContractAndCheckoutInPerson, x.Insurance, + x.InsuranceInPerson, x.RollCall, x.RollCallInPerson, x.CustomizeCheckout, x.Price, x.WorkshopId, + x.CurrentWorkshopId, 0)).ToList(); + InstitutionContractId = institutionContractId; + } + + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; private set; } + public List PrevWorkshops { get; private set; } + public List NewWorkshops { get; private set; } + public long InstitutionContractId { get; private set; } +} + +public class InstitutionContractAmendmentTempNewWorkshop : InstitutionContractAmendmentTempPrevWorkshop +{ + public InstitutionContractAmendmentTempNewWorkshop(string workshopName, int countPerson, bool contractAndCheckout, + bool contractAndCheckoutInPerson, bool insurance, bool insuranceInPerson, bool rollCall, bool rollCallInPerson, + bool customizeCheckout, double price, long workshopId, long currentWorkshopId,double priceDifference) : base( + workshopName, countPerson, contractAndCheckout, contractAndCheckoutInPerson, insurance, insuranceInPerson, + rollCall, rollCallInPerson, customizeCheckout, price, workshopId, currentWorkshopId) + { + PriceDifference = priceDifference; + } + + /// + /// مبلغ اختلاف کارگاه جدید با کارگاه قبلی(مبلغ اصلی ارتقاء) + /// + public double PriceDifference { get; private set; } + + + public void Edit(string workshopName, int countPerson, bool contractAndCheckout, + bool contractAndCheckoutInPerson, + bool insurance, bool insuranceInPerson, bool rollCall, bool customizeCheckout, + double price,double priceDifference) + { + base.Edit(workshopName, countPerson, contractAndCheckout, contractAndCheckoutInPerson, insurance, + insuranceInPerson, rollCall, customizeCheckout, price); + PriceDifference = priceDifference; + } +} + +public class InstitutionContractAmendmentTempPrevWorkshop +{ + public InstitutionContractAmendmentTempPrevWorkshop(string workshopName, int countPerson, bool contractAndCheckout, + bool contractAndCheckoutInPerson, + bool insurance, bool insuranceInPerson, + bool rollCall, bool rollCallInPerson, bool customizeCheckout, double price, long workshopId, + long currentWorkshopId) + { + Id = Guid.NewGuid(); + WorkshopName = workshopName; + CountPerson = countPerson; + ContractAndCheckout = contractAndCheckout; + Insurance = insurance; + RollCall = rollCall; + CustomizeCheckout = customizeCheckout; + ContractAndCheckoutInPerson = contractAndCheckoutInPerson; + InsuranceInPerson = insuranceInPerson; + RollCallInPerson = rollCallInPerson; + Price = price; + WorkshopId = workshopId; + CurrentWorkshopId = currentWorkshopId; + } + + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } + + public long CurrentWorkshopId { get; private set; } + public long WorkshopId { get; set; } + + /// + /// نام کارگاه + /// + public string WorkshopName { get; private set; } + + /// + /// تعداد پرسنل + /// + public int CountPerson { get; private set; } + + + #region ServiceSelection + + /// + /// قرارداد و تصفیه + /// + public bool ContractAndCheckout { get; private set; } + + /// + /// بیمه + /// + public bool Insurance { get; private set; } + + /// + /// حضورغباب + /// + public bool RollCall { get; private set; } + + public bool RollCallInPerson { get; set; } + + /// + /// فیش غیر رسمی + /// + public bool CustomizeCheckout { get; private set; } + + /// + /// خدمات حضوری قرداد و تصفیه + /// + public bool ContractAndCheckoutInPerson { get; private set; } + + /// + /// خدمات حضوری بیمه + /// + public bool InsuranceInPerson { get; private set; } + + public double Price { get; private set; } + + #endregion + + public void Edit(string workshopName, int countPerson, bool contractAndCheckout, bool contractAndCheckoutInPerson, + bool insurance, bool insuranceInPerson, bool rollCall, bool customizeCheckout, + double price) + { + WorkshopName = workshopName; + CountPerson = countPerson; + ContractAndCheckout = contractAndCheckout; + Insurance = insurance; + RollCall = rollCall; + CustomizeCheckout = customizeCheckout; + ContractAndCheckoutInPerson = contractAndCheckoutInPerson; + InsuranceInPerson = insuranceInPerson; + Price = price; + } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/InstitutionContract/GetInstitutionContractListItemsViewModel.cs b/CompanyManagment.App.Contracts/InstitutionContract/GetInstitutionContractListItemsViewModel.cs index 65392104..123dc18a 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/GetInstitutionContractListItemsViewModel.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/GetInstitutionContractListItemsViewModel.cs @@ -87,6 +87,10 @@ public class GetInstitutionContractListItemsViewModel public long ContractingPartyId { get; set; } public List Workshops { get; set; } + + public bool IsInPersonContract { get; set; } + + public bool IsOldContract { get; set; } } public class InstitutionContractListWorkshop diff --git a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs index 8cfc66af..1d361563 100644 --- a/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs +++ b/CompanyManagment.App.Contracts/InstitutionContract/IInstitutionContractApplication.cs @@ -234,28 +234,19 @@ public interface IInstitutionContractApplication #region Upgrade (Amendment) Task GetAmendmentWorkshops(long institutionContractId); + Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request); + Task RemoveAmendmentWorkshops(Guid workshopTempId); Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request); - #endregion Task ResendVerifyLink(long institutionContractId); } -public class InsitutionContractAmendmentPaymentRequest +public class InsertAmendmentTempWorkshopResponse { - List Workshops { get; set; } - public long InstitutionContractId { get; set; } -} - -public class InsitutionContractAmendmentPaymentResponse -{ - public InstitutionContractPaymentOneTimeViewModel OneTime { get; set; } - public InstitutionContractPaymentMonthlyViewModel Monthly { get; set; } - public string ContractStart { get; set; } - public string ContractEnd { get; set; } - public string OneMonthAmount { get; set; } - public string TotalAmount { get; set; } + public Guid WorkshopTempId { get; set; } + public string Amount { get; set; } } public class InstitutionContractAmendmentWorkshopsResponse @@ -263,7 +254,9 @@ public class InstitutionContractAmendmentWorkshopsResponse /// /// /// - public List Workshops { get; set; } + public List Workshops { get; set; } + + public Guid TempId { get; set; } } diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InsitutionContractAmendmentPaymentRequest.cs b/CompanyManagment.App.Contracts/InstitutionContract/InsitutionContractAmendmentPaymentRequest.cs new file mode 100644 index 00000000..c1444835 --- /dev/null +++ b/CompanyManagment.App.Contracts/InstitutionContract/InsitutionContractAmendmentPaymentRequest.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using CompanyManagment.App.Contracts.TemporaryClientRegistration; + +namespace CompanyManagment.App.Contracts.InstitutionContract; + +public class InsitutionContractAmendmentPaymentRequest +{ + public Guid TempId { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InsitutionContractAmendmentPaymentResponse.cs b/CompanyManagment.App.Contracts/InstitutionContract/InsitutionContractAmendmentPaymentResponse.cs new file mode 100644 index 00000000..f6a90dc4 --- /dev/null +++ b/CompanyManagment.App.Contracts/InstitutionContract/InsitutionContractAmendmentPaymentResponse.cs @@ -0,0 +1,11 @@ +namespace CompanyManagment.App.Contracts.InstitutionContract; + +public class InsitutionContractAmendmentPaymentResponse +{ + public InstitutionContractPaymentOneTimeViewModel OneTime { get; set; } + public InstitutionContractPaymentMonthlyViewModel Monthly { get; set; } + public string ContractStart { get; set; } + public string ContractEnd { get; set; } + public string OneMonthAmount { get; set; } + public string TotalAmount { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractAmendmentTempWorkshopViewModel.cs b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractAmendmentTempWorkshopViewModel.cs new file mode 100644 index 00000000..242d6287 --- /dev/null +++ b/CompanyManagment.App.Contracts/InstitutionContract/InstitutionContractAmendmentTempWorkshopViewModel.cs @@ -0,0 +1,64 @@ +using System; + +namespace CompanyManagment.App.Contracts.InstitutionContract; + +public class InstitutionContractAmendmentTempWorkshopViewModel +{ + public Guid TempId { get; set; } + + public Guid WorkshopTempId { get; set; } + + public long CurrentWorkshopId { get; set; } + + public long WorkshopId { get; set; } + + /// + /// نام کارگاه + /// + public string WorkshopName { get; set; } + + /// + /// تعداد پرسنل + /// + public int CountPerson { get; set; } + + + #region ServiceSelection + + /// + /// قرارداد و تصفیه + /// + public bool ContractAndCheckout { get; set; } + + /// + /// بیمه + /// + public bool Insurance { get; set; } + + /// + /// حضورغباب + /// + public bool RollCall { get; set; } + + public bool RollCallInPerson { get; set; } + + /// + /// فیش غیر رسمی + /// + public bool CustomizeCheckout { get; set; } + + /// + /// خدمات حضوری قرداد و تصفیه + /// + public bool ContractAndCheckoutInPerson { get; set; } + + /// + /// خدمات حضوری بیمه + /// + public bool InsuranceInPerson { get; set; } + + public double Price{ get; set; } + public string PriceStr{ get; set; } + + #endregion +} \ No newline at end of file diff --git a/CompanyManagment.Application/InstitutionContractApplication.cs b/CompanyManagment.Application/InstitutionContractApplication.cs index 2d458a64..f6599b33 100644 --- a/CompanyManagment.Application/InstitutionContractApplication.cs +++ b/CompanyManagment.Application/InstitutionContractApplication.cs @@ -1340,6 +1340,16 @@ public class InstitutionContractApplication : IInstitutionContractApplication return await _institutionContractRepository.GetAmendmentWorkshops(institutionContractId); } + public async Task InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request) + { + return await _institutionContractRepository.InsertAmendmentTempWorkshops(request); + } + + public Task RemoveAmendmentWorkshops(Guid workshopTempId) + { + return _institutionContractRepository.RemoveAmendmentWorkshops(workshopTempId); + } + public Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request) { return _institutionContractRepository.GetAmendmentPaymentDetails(request); @@ -1462,7 +1472,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication return operation.Succcedded(personalContractingParty); } - private List CalculateInstallment(double amount, int installmentCount, + public static List CalculateInstallment(double amount, int installmentCount, string loanStartDate, bool getRounded) { int day = Convert.ToInt32(loanStartDate.Substring(8, 2)); diff --git a/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs b/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs index b376875f..fb81f9d6 100644 --- a/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs +++ b/CompanyManagment.Application/TemporaryClientRegistrationApplication.cs @@ -674,7 +674,7 @@ public class TemporaryClientRegistrationApplication : ITemporaryClientRegistrati result.MonthlyValueAddedTaxStr= tenPercent.ToMoney(); var monthlyTotalPaymentDouble = sumOfWorkshopsPaymentDouble + tenPercent; result.MonthlyTotalPaymentStr = monthlyTotalPaymentDouble.ToMoney(); - var installmentList = InstitutionContractRepository.InstitutionMonthlyInstallmentCaculation(duration, monthlyTotalPaymentDouble, installmentstart); + var installmentList = InstitutionContractRepository.InstitutionMonthlyInstallmentCaculation((int)duration, monthlyTotalPaymentDouble, installmentstart); #endregion diff --git a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs index 1f71ae28..c06a307b 100644 --- a/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs +++ b/CompanyManagment.EFCore/Repository/InstitutionContractRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Drawing; +using System.Globalization; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; @@ -16,6 +17,7 @@ using Company.Domain.empolyerAgg; using Company.Domain.FinancialStatmentAgg; using Company.Domain.FinancialTransactionAgg; using Company.Domain.InstitutionContractAgg; +using Company.Domain.InstitutionContractAmendmentTempAgg; using Company.Domain.InstitutionContractContactInfoAgg; using Company.Domain.InstitutionContractExtensionTempAgg; using Company.Domain.InstitutionPlanAgg; @@ -42,6 +44,7 @@ public class InstitutionContractRepository : RepositoryBase _institutionExtensionTemp; + private readonly IMongoCollection _institutionAmendmentTemp; private readonly IPlanPercentageRepository _planPercentageRepository; private readonly ISmsService _smsService; @@ -56,6 +59,8 @@ public class InstitutionContractRepository : RepositoryBase("InstitutionContractExtensionTemp"); + _institutionAmendmentTemp = + database.GetCollection("InstitutionContractAmendmentTemp"); } public EditInstitutionContract GetDetails(long id) @@ -1240,7 +1245,6 @@ public class InstitutionContractRepository : RepositoryBase { - Console.WriteLine(x.contractingParty.id); var workshops = x.contractingParty.Employers .SelectMany(e => e.WorkshopEmployers.Select(we => we.Workshop)).DistinctBy(w => w.id).ToList(); @@ -1289,6 +1293,10 @@ public class InstitutionContractRepository : RepositoryBase workshops.Select(w => w.id).Contains(l.WorkshopId)) + .Count(l => l.StartWorkDate <= DateTime.Now && l.LeftWorkDate >= DateTime.Now); return new GetInstitutionContractListItemsViewModel() { ContractAmount = x.contract.ContractAmount, @@ -1303,14 +1311,16 @@ public class InstitutionContractRepository : RepositoryBase workshops.Select(w => w.id).Contains(l.WorkshopId)) - .Count(l => l.StartWorkDate <= DateTime.Now && l.LeftWorkDate >= DateTime.Now), + EmployeesCount = employeesCount, EmployerNames = employers.Select(e => e.FullName).ToList(), ListStatus = status, IsExpired = x.contract.ContractEndGr <= endThisMontGr, ContractingPartyId = x.contractingParty.id, - Workshops = workshopDetails + Workshops = workshopDetails, + IsInPersonContract = x.contract.WorkshopGroup?.CurrentWorkshops + .Any(y=>y.Services.ContractInPerson)??true, + IsOldContract = x.contract.WorkshopGroup?.CurrentWorkshops + .Any(y=>y.Price == 0)??true }; }).ToList() }; @@ -2239,7 +2249,7 @@ public class InstitutionContractRepository : RepositoryBase x.ContractingPartyId == contractingParty.id)) { @@ -2346,46 +2355,251 @@ public class InstitutionContractRepository : RepositoryBase x.WorkshopGroup) .ThenInclude(x => x.CurrentWorkshops) .FirstOrDefaultAsync(x => x.id == institutionContractId); - - var workshops = institutionContract.WorkshopGroup.CurrentWorkshops.Select(x => new WorkshopTempViewModel() + + if (institutionContract.WorkshopGroup.CurrentWorkshops.Any(x => x.Price == 0)) { - Id = x.id, - ContractAndCheckout = x.Services.Contract, - ContractAndCheckoutInPerson = x.Services.ContractInPerson, - CustomizeCheckout = x.Services.CustomizeCheckout, - CountPerson = x.PersonnelCount, - Insurance = x.Services.Insurance, - InsuranceInPerson = x.Services.InsuranceInPerson, - RollCall = x.Services.RollCall, - WorkshopName = x.WorkshopName, - WorkshopServicesAmountStr = x.Price.ToMoney(), - WorkshopServicesAmount = x.Price, - WorkshopId = x.WorkshopId ?? 0, - RollCallInPerson = x.Services.RollCallInPerson, + throw new BadRequestException( + "این قرارداد قابل ارتقا به صورت ظاهری نیست لطفا به صورت دیتابیسی اقدام به ویرایش کنید"); + } - }).ToList(); + var workshops = institutionContract.WorkshopGroup.CurrentWorkshops + .Select(x => new InstitutionContractAmendmentTempPrevWorkshop(x.WorkshopName,x.PersonnelCount, + x.Services.Contract,x.Services.ContractInPerson,x.Services.Insurance, + x.Services.InsuranceInPerson,x.Services.RollCall,x.Services.RollCallInPerson, + x.Services.CustomizeCheckout,x.Price, + x.WorkshopId??0,x.id)).ToList(); + + + + var temp = new InstitutionContractAmendmentTemp(workshops, institutionContractId); + + await _institutionAmendmentTemp.InsertOneAsync(temp); + + var prevWorkshops = workshops.Select(x => + new InstitutionContractAmendmentTempWorkshopViewModel() + { + WorkshopName = x.WorkshopName, + CountPerson = x.CountPerson, + ContractAndCheckout = x.ContractAndCheckout, + ContractAndCheckoutInPerson = x.ContractAndCheckoutInPerson, + Insurance = x.Insurance, + InsuranceInPerson = x.InsuranceInPerson, + RollCall = x.RollCall, + RollCallInPerson = x.RollCallInPerson, + CustomizeCheckout = x.CustomizeCheckout, + PriceStr = x.Price.ToMoney(), + Price = x.Price, + WorkshopId = x.WorkshopId, + WorkshopTempId = x.Id, + CurrentWorkshopId = x.CurrentWorkshopId, + TempId =temp.Id + }) + .ToList(); var res = new InstitutionContractAmendmentWorkshopsResponse() { - Workshops = workshops + Workshops = prevWorkshops, + TempId = temp.Id }; + return res; } - public async Task GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request) + public async Task GetAmendmentPaymentDetails( + InsitutionContractAmendmentPaymentRequest request) { - var institutionContract =await _context.InstitutionContractSet - .Include(x => x.WorkshopGroup) - .ThenInclude(x => x.CurrentWorkshops) - .FirstOrDefaultAsync(x => x.id == request.InstitutionContractId); - if (institutionContract == null) - throw new NotFoundException("قرارداد مالی یافت نشد"); + var institutionContractAmendmentTemp = await _institutionAmendmentTemp + .Find(x=>x.Id == request.TempId) + .FirstOrDefaultAsync(); + if (institutionContractAmendmentTemp == null) + throw new NotFoundException("دیتای وارد شده نامعتبر است"); var amendmentStart = DateTime.Now; - var amendmentEnd = institutionContract.ContractEndGr; -//TODO : محاسبه مبلغ بر اساس کارگاه های انتخاب شده - var res = new InsitutionContractAmendmentPaymentResponse(); - return res; + + var institutionContract = await _context.InstitutionContractSet + .Include(x=>x.WorkshopGroup) + .ThenInclude(x=>x.CurrentWorkshops) + .FirstOrDefaultAsync(x => x.id == institutionContractAmendmentTemp.InstitutionContractId); + if (institutionContract == null) + throw new NotFoundException("قرارداد مؤسسه یافت نشد"); + + var amendmentEnd = institutionContract.ContractEndGr; + + var haContractInPerson = institutionContract.WorkshopGroup.CurrentWorkshops + .Any(x => x.Services.ContractInPerson); + if (!haContractInPerson) + { + if (institutionContractAmendmentTemp.NewWorkshops.Any(x => x.ContractAndCheckoutInPerson)) + { + throw new BadRequestException("برای قرارداد آنلاین نمیتوان سرویس حضوری انتخاب کرد"); + } + } + + var pc = new PersianCalendar(); + + int startYear = pc.GetYear(amendmentStart); + int startMonth = pc.GetMonth(amendmentStart); + int startDay = pc.GetDayOfMonth(amendmentStart); + + int endYear = pc.GetYear(amendmentEnd); + int endMonth = pc.GetMonth(amendmentEnd); + int endDay = pc.GetDayOfMonth(amendmentEnd); + + // اختلاف خام ماه‌ها + int monthDiff = (endYear - startYear) * 12 + (endMonth - startMonth); + + // اگر حتی چند روز از ماه بعدی هم گذشته بود → رند به بالا + if (endDay > startDay) + monthDiff++; + + var sumOneMonth = institutionContractAmendmentTemp.NewWorkshops.Sum(x => x.PriceDifference); + + var baseAmount = monthDiff * sumOneMonth; + var tax = baseAmount*0.10; + var totalPayment = tax+baseAmount; + + + var res = new InsitutionContractAmendmentPaymentResponse() + { + ContractStart = amendmentStart.ToFarsi(), + ContractEnd = amendmentEnd.ToFarsi(), + OneMonthAmount = sumOneMonth.ToMoney(), + TotalAmount = baseAmount.ToMoney(), + }; + + res.OneTime = new InstitutionContractPaymentOneTimeViewModel() + { + TotalAmount = baseAmount.ToMoney(), + PaymentAmount = totalPayment.ToMoney(), + Tax = tax.ToMoney() + }; + + if (haContractInPerson) + { + var installment = InstitutionMonthlyInstallmentCaculation(monthDiff,totalPayment, amendmentStart.ToFarsi()); + + var firstPrevInstallment = installment.First(); + var lastPrevInstallment = installment.Last(); + + var firstInstallment = new MonthlyInstallment() + { + InstallmentAmountStr = firstPrevInstallment.InstallmentAmountStr, + InstallmentCounter = firstPrevInstallment.InstallmentCounter, + InstalmentDate = amendmentStart.ToFarsi() + }; + + var lastInstallment = new MonthlyInstallment() + { + InstallmentAmountStr = lastPrevInstallment.InstallmentAmountStr, + InstallmentCounter = lastPrevInstallment.InstallmentCounter, + InstalmentDate = lastPrevInstallment.InstalmentDate + }; + + installment.Remove(firstPrevInstallment); + installment.Remove(lastPrevInstallment); + + installment.Insert(0, firstInstallment); + installment.Add(lastInstallment); + + res.Monthly = new InstitutionContractPaymentMonthlyViewModel() + { + Installments = installment, + TotalAmount = baseAmount.ToMoney(), + PaymentAmount = totalPayment.ToMoney(), + Tax = tax.ToMoney() + + }; + + } + return res; + } + + public async Task InsertAmendmentTempWorkshops( + InstitutionContractAmendmentTempWorkshopViewModel request) + { + var amendmentTemp =await _institutionAmendmentTemp + .Find(x=> x.Id == request.TempId).FirstOrDefaultAsync(); + + if (amendmentTemp == null) + throw new BadRequestException("دیتای وارد شده نامعتبر است"); + + var workshopTemp = amendmentTemp.NewWorkshops + .FirstOrDefault(x => x.Id == request.WorkshopTempId); + + var planForWorkshop = new WorkshopTempViewModel() + { + WorkshopName = request.WorkshopName, + CountPerson = request.CountPerson, + ContractAndCheckout = request.ContractAndCheckout, + ContractAndCheckoutInPerson = request.ContractAndCheckoutInPerson, + Insurance = request.Insurance, + InsuranceInPerson = request.InsuranceInPerson, + RollCall = request.RollCall, + RollCallInPerson = request.RollCallInPerson, + CustomizeCheckout = request.CustomizeCheckout + }; + var price = _planPercentageRepository.GetInstitutionPlanForWorkshop(planForWorkshop) + .OnlineAndInPersonSumAmountDouble; + + if (workshopTemp == null) + { + var newWorkshopTemp = new InstitutionContractAmendmentTempNewWorkshop(request.WorkshopName, + request.CountPerson, + request.ContractAndCheckout, request.ContractAndCheckoutInPerson, + request.Insurance, request.InsuranceInPerson, + request.RollCall, request.RollCallInPerson, + request.CustomizeCheckout, price, + request.WorkshopId,0,price); + + workshopTemp = newWorkshopTemp; + + + amendmentTemp.NewWorkshops.Add(newWorkshopTemp); + + await _institutionAmendmentTemp + .ReplaceOneAsync(x => x.Id == amendmentTemp.Id, amendmentTemp); + } + else + { + amendmentTemp.NewWorkshops.Remove(workshopTemp); + + var differencePrice = price - workshopTemp.Price; + workshopTemp.Edit(request.WorkshopName, request.CountPerson, + request.ContractAndCheckout, request.ContractAndCheckoutInPerson, + request.Insurance, request.InsuranceInPerson, + request.RollCall, + request.CustomizeCheckout, price,differencePrice); + + amendmentTemp.NewWorkshops.Add(workshopTemp); + + await _institutionAmendmentTemp + .ReplaceOneAsync(x => x.Id == amendmentTemp.Id, amendmentTemp); + } + + return new InsertAmendmentTempWorkshopResponse() + { + WorkshopTempId = workshopTemp.Id, + Amount = workshopTemp.PriceDifference.ToMoney() + }; + } + + public async Task RemoveAmendmentWorkshops(Guid workshopTempId) + { + var amendmentTemp = await _institutionAmendmentTemp.Find(x => x.NewWorkshops.Any(w => w.Id == workshopTempId)) + .FirstOrDefaultAsync(); + if (amendmentTemp == null) + throw new BadRequestException("دیتای وارد شده نامعتبر است"); + var workshopTemp = amendmentTemp.NewWorkshops.FirstOrDefault(x => x.Id == workshopTempId); + if (workshopTemp == null) + throw new BadRequestException("دیتای وارد شده نامعتبر است"); + + if (workshopTemp.CurrentWorkshopId!=0) + throw new BadRequestException("شما نمی توانید این کارگاه را حذف کنید زیرا در قرارداد اصلی وجود دارد"); + + amendmentTemp.NewWorkshops.Remove(workshopTemp); + + await _institutionAmendmentTemp.ReplaceOneAsync(x => x.Id == amendmentTemp.Id, amendmentTemp); + } public async Task> GetInstitutionContractSelectList(string search, string selected) @@ -2464,7 +2678,7 @@ public class InstitutionContractRepository : RepositoryBase InstitutionMonthlyInstallmentCaculation(InstitutionContractDuration duration, + public static List InstitutionMonthlyInstallmentCaculation(int duration, double monthlyTotalPaymentDouble, string installmentstart) { @@ -2554,7 +2768,7 @@ public class InstitutionContractRepository : RepositoryBase(); - int instalmentCount = (int)duration; + int instalmentCount = duration; var instalmentAmount = monthlyTotalPaymentDouble / instalmentCount; int currentInstallmentStartDay = int.Parse(installmentstart.Substring(8, 2)); bool endOfMonth = currentInstallmentStartDay == 31; @@ -2614,6 +2828,7 @@ public class InstitutionContractRepository : RepositoryBase> InsertAmendmentTempWorkshops([FromBody]InstitutionContractAmendmentTempWorkshopViewModel request) + { + var res =await _institutionContractApplication.InsertAmendmentTempWorkshops(request); + return res; + } + [HttpDelete("amendment/remove-temp-workshops/{workshopTempId:guid}")] + public async Task RemoveAmendmentWorkshops(Guid workshopTempId) + { + await _institutionContractApplication.RemoveAmendmentWorkshops(workshopTempId); + return Ok(); + } + [HttpPost("amendment/payment-details")] + public async Task> GetAmendmentPaymentDetails([FromBody]InsitutionContractAmendmentPaymentRequest request) + { + var res =await _institutionContractApplication.GetAmendmentPaymentDetails(request); + return res; + } + + + [HttpGet("edit-old/{id}")] + public ActionResult GetEditOldDetails(long id) + { + var representativList = new List(); + var contractingPartyList = new List(); + 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 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; + } }