/// <summary> /// Creates the company payment summary. /// </summary> /// <param name="amount">The amount.</param> /// <param name="nextCycleStartingDate">The next cycle starting date.</param> /// <param name="paymentSummaryDetail">The payment summary detail.</param> /// <param name="discountCodeUsage">The discount code usage.</param> /// <param name="fromDate">From date.</param> /// <param name="toDate">To date.</param> /// <param name="shouldMonthlyAgentProcessed">if set to <c>true</c> [should monthly agent processed].</param> /// <param name="paymentMethodCodeId">The payment method code identifier.</param> /// <param name="companyPaymentPackage">The company payment package.</param> /// <returns></returns> private static CompanyPaymentSummary CreateCompanyPaymentSummary(decimal amount, DateTime nextCycleStartingDate, PaymentSummaryDetails paymentSummaryDetail, DiscountCodeUsage discountCodeUsage, DateTime fromDate, DateTime toDate, bool shouldMonthlyAgentProcessed, int?paymentMethodCodeId, CompanyPaymentPackage companyPaymentPackage) { CompanyPaymentSummary companyPaymentSummary = new CompanyPaymentSummary() { CompanyId = paymentSummaryDetail.CompanyId, ShouldProcess = (paymentSummaryDetail.PaymentMethodCodeId != null && paymentSummaryDetail.ShouldProcess), IsMonthlyAgentProcessed = shouldMonthlyAgentProcessed, CompanyPaymentPackage = companyPaymentPackage, IsImmidiateFutureRecordCreated = false, Amount = decimal.Round((amount <= 0 ? 0 : amount), 2), NextPaymentCycleStartingDate = nextCycleStartingDate, FromDate = fromDate, ToDate = toDate, CreatedBy = paymentSummaryDetail.UserId, LastUpdatedBy = paymentSummaryDetail.UserId, CreatedDate = Utils.Today, LastUpdatedDate = Utils.Today, PaymentMethodCodeId = paymentMethodCodeId }; if (!paymentSummaryDetail.IsEducationPackage && discountCodeUsage != null) //we should only include the discound usage to summary if the company is not educational { companyPaymentSummary.DiscountCodeUsageId = discountCodeUsage.DiscountCodeUsageId; } return(companyPaymentSummary); }
/// <summary> /// Updates the payment summary for free trial company. /// </summary> /// <param name="companyId">The company identifier.</param> /// <param name="discountCodeUsage">The discount code usage.</param> /// <param name="isCompanySuspend">The is company suspend.</param> /// <param name="userId">The user identifier.</param> /// <param name="dataContext">The data context.</param> public static void UpdatePaymentSummaryForFreeTrialCompany(int companyId, DiscountCodeUsage discountCodeUsage, bool?isCompanySuspend, int userId, StageBitzDB dataContext) { CompanyBL companyBL = new CompanyBL(dataContext); if (companyBL.IsFreeTrialStatusIncludedFortheDay(companyId, Utils.Today)) { if (isCompanySuspend != null) { CompanyPaymentSummary existingCompanyPackageSummary = GetCurrentCompanyPaymentSummary(companyId, dataContext); if (existingCompanyPackageSummary != null) { existingCompanyPackageSummary.ShouldProcess = !isCompanySuspend.Value; existingCompanyPackageSummary.LastUpdatedDate = Utils.Today; existingCompanyPackageSummary.LastUpdatedBy = userId; } } else { FinanceBL financeBL = new FinanceBL(dataContext); CompanyPaymentPackage companyPaymentPackage = financeBL.GetCurrentPaymentPackageFortheCompanyIncludingFreeTrial(companyId); if (companyPaymentPackage != null) { PaymentSummaryDetails paymentSummaryDetails = new PaymentSummaryDetails() { CompanyPaymentPackage = companyPaymentPackage, CompanyId = companyId, ShouldProcess = true, UserId = userId, PackageStartDate = companyPaymentPackage.StartDate, PaymentMethodCodeId = companyPaymentPackage.PaymentMethodCodeId, HasPackageChanged = false, ProjectPaymentPackageTypeId = companyPaymentPackage.ProjectPaymentPackageTypeId, InventoryPaymentPackageTypeId = companyPaymentPackage.InventoryPaymentPackageTypeId, IsEducationPackage = companyPaymentPackage.IsEducationalPackage, PaymentDurationTypeCodeId = companyPaymentPackage.PaymentDurationCodeId, }; if (!companyPaymentPackage.IsEducationalPackage) //we should only include the discound usage to summary if the company is not educational { paymentSummaryDetails.DiscountCodeUsageToApply = discountCodeUsage; } CreateCompanyPaymentSummaries(paymentSummaryDetails, Utils.Today, dataContext); } } } }
/// <summary> /// Activates the unprocessed summaries. /// </summary> /// <param name="companyId">The company identifier.</param> /// <param name="userId">The user identifier.</param> public void ActivateUnProcessedSummaries(int companyId, int userId) { // if there are summaries which were set to should not process if the company is reactivated or payment made sucess during this period // these records will be activated for that period. CompanyPaymentSummary companyPackageSummary = (from cps in DataContext.CompanyPaymentSummaries where cps.IsMonthlyAgentProcessed == false && cps.ShouldProcess == false && cps.CompanyId == companyId && cps.FromDate <= Utils.Today && cps.ToDate >= Utils.Today select cps).OrderByDescending(cps => cps.CompanyPaymentSummaryId).FirstOrDefault(); if (companyPackageSummary != null) { companyPackageSummary.ShouldProcess = true; companyPackageSummary.LastUpdatedBy = userId; companyPackageSummary.LastUpdatedDate = Utils.Today; } }
/// <summary> /// Creates the company payment summaries. /// This method will be called when a user selects/upgrades/downgrades a pricing plan . Also when the payment cycle ends Daily agent will call it for the repeat payments /// </summary> /// <param name="paymentSummaryDetail">The payment summary detail.</param> /// <param name="dateToConsider">The date to consider.</param> /// <param name="dataContext">The data context.</param> public static void CreateCompanyPaymentSummaries(PaymentSummaryDetails paymentSummaryDetail, DateTime dateToConsider, StageBitzDB dataContext) { CompanyBL companyBL = new CompanyBL(dataContext); CompanyPaymentSummary existingCompanyPackageSummary = GetCurrentCompanyPaymentSummary(paymentSummaryDetail.CompanyId, dataContext); List <CompanyPaymentSummary> paymentPackageSummaries = GetPaymentPackageSummaries(paymentSummaryDetail, dateToConsider, dataContext); if (paymentPackageSummaries.Count > 0) { //check whether there is an upgrade/downgrade during the freetrial if (existingCompanyPackageSummary != null && companyBL.IsFreeTrialStatusIncludedFortheDay(paymentSummaryDetail.CompanyId, dateToConsider)) { dataContext.CompanyPaymentSummaries.DeleteObject(existingCompanyPackageSummary); } foreach (CompanyPaymentSummary companyPaymentSummary in paymentPackageSummaries) { dataContext.CompanyPaymentSummaries.AddObject(companyPaymentSummary); } } //TODO - for invoice option we need to send an email to SB admin (Invoice Request) Repeat Payment Email }
/// <summary> /// Gets the payment package summaries. /// </summary> /// <param name="paymentSummaryDetail">The payment summary detail.</param> /// <param name="dateToConsider">The date to consider.</param> /// <param name="dataContext">The data context.</param> /// <returns></returns> public static List <CompanyPaymentSummary> GetPaymentPackageSummaries(PaymentSummaryDetails paymentSummaryDetail, DateTime dateToConsider, StageBitzDB dataContext) { int anualDurationCodeId = Utils.GetCodeIdByCodeValue("PaymentPackageDuration", "ANUAL"); int invoiceMethodCodeId = Utils.GetCodeIdByCodeValue("PaymentMethod", "INVOICE"); List <CompanyPaymentSummary> summaryList = new List <CompanyPaymentSummary>(); DateTime nextCycleStartDate = Utils.Today; decimal totalDue = 0; decimal educationalDiscount = decimal.Parse(Utils.GetSystemValue("EducationalDiscount")); FinanceBL financeBL = new FinanceBL(dataContext); CompanyBL companyBL = new CompanyBL(dataContext); CompanyPaymentSummary existingCompanyPackageSummary = dataContext.CompanyPaymentSummaries.Where(cps => cps.CompanyId == paymentSummaryDetail.CompanyId).OrderByDescending(cps => cps.CompanyPaymentSummaryId).FirstOrDefault(); CompanyPaymentPackage currentCompanyPaymentPackage = financeBL.GetPaymentPackageForCompanyByDay(dateToConsider, paymentSummaryDetail.CompanyId); if (existingCompanyPackageSummary != null && companyBL.IsFreeTrialCompany(paymentSummaryDetail.CompanyId)) //check whether there is an upgrade/downgrade during the freetrial { existingCompanyPackageSummary = null; } if (existingCompanyPackageSummary == null || currentCompanyPaymentPackage == null) { //This is for the very first time from UI. So return the amount based on promotional and educational discount amount. totalDue = financeBL.CalculateALLPackageAmountsByPeriod(paymentSummaryDetail.ProjectPaymentPackageTypeId, paymentSummaryDetail.InventoryPaymentPackageTypeId, paymentSummaryDetail.PaymentDurationTypeCodeId); if (paymentSummaryDetail.IsEducationPackage) { totalDue = totalDue * (100 - educationalDiscount) / 100; } else if (paymentSummaryDetail.DiscountCodeUsageToApply != null) { DateTime endDate = paymentSummaryDetail.PaymentDurationTypeCodeId == anualDurationCodeId?paymentSummaryDetail.PackageStartDate.AddYears(1) : paymentSummaryDetail.PackageStartDate.AddMonths(1); totalDue = financeBL.GetDiscountedAmount(paymentSummaryDetail.CompanyId, totalDue, paymentSummaryDetail.PaymentDurationTypeCodeId, paymentSummaryDetail.DiscountCodeUsageToApply, paymentSummaryDetail.PackageStartDate, endDate); } nextCycleStartDate = paymentSummaryDetail.PaymentDurationTypeCodeId == anualDurationCodeId?paymentSummaryDetail.PackageStartDate.AddYears(1) : paymentSummaryDetail.PackageStartDate.AddMonths(1); summaryList.Add(CreateCompanyPaymentSummary(totalDue, nextCycleStartDate, paymentSummaryDetail, paymentSummaryDetail.DiscountCodeUsageToApply, paymentSummaryDetail.PackageStartDate, nextCycleStartDate, (paymentSummaryDetail.PaymentMethodCodeId != null && paymentSummaryDetail.PaymentMethodCodeId == invoiceMethodCodeId), paymentSummaryDetail.PaymentMethodCodeId, paymentSummaryDetail.CompanyPaymentPackage)); } else { //This happens when a user upgrades or daily agent makes repeat payments at the end of the Payment Cycle. DateTime endDate = existingCompanyPackageSummary.NextPaymentCycleStartingDate; int dateDifference = 0; InventoryPaymentPackageDetails currentInventoryPaymentPackageDetails = Utils.GetSystemInventoryPackageDetailByPaymentPackageTypeId(currentCompanyPaymentPackage.InventoryPaymentPackageTypeId); InventoryPaymentPackageDetails newInventoryPaymentPackageDetails = Utils.GetSystemInventoryPackageDetailByPaymentPackageTypeId(paymentSummaryDetail.InventoryPaymentPackageTypeId); ProjectPaymentPackageDetails currentProjectPaymentPackageDetails = Utils.GetSystemProjectPackageDetailByPaymentPackageTypeId(currentCompanyPaymentPackage.ProjectPaymentPackageTypeId); ProjectPaymentPackageDetails newProjectPaymentPackageDetails = Utils.GetSystemProjectPackageDetailByPaymentPackageTypeId(paymentSummaryDetail.ProjectPaymentPackageTypeId); decimal currentTotalAmount, newTotalAmount; //Just Get the Amounts from tables if (currentCompanyPaymentPackage.PaymentDurationCodeId == anualDurationCodeId) { currentTotalAmount = currentInventoryPaymentPackageDetails.AnualAmount + currentProjectPaymentPackageDetails.AnualAmount; newTotalAmount = newInventoryPaymentPackageDetails.AnualAmount + newProjectPaymentPackageDetails.AnualAmount; } else { currentTotalAmount = currentInventoryPaymentPackageDetails.Amount + currentProjectPaymentPackageDetails.Amount; newTotalAmount = newInventoryPaymentPackageDetails.Amount + newProjectPaymentPackageDetails.Amount; } if (dateToConsider < endDate && paymentSummaryDetail.HasPackageChanged) //this happens only when a user upgrades during the payment cycle { dateDifference = (int)(endDate - dateToConsider).TotalDays; totalDue = GetProrataAmount(paymentSummaryDetail, currentCompanyPaymentPackage, existingCompanyPackageSummary.DiscountCodeUsage, newTotalAmount, currentTotalAmount, endDate, dateDifference); summaryList.Add(CreateCompanyPaymentSummary(totalDue, endDate, paymentSummaryDetail, paymentSummaryDetail.DiscountCodeUsageToApply, dateToConsider, endDate, (paymentSummaryDetail.PaymentMethodCodeId != null && paymentSummaryDetail.PaymentMethodCodeId == invoiceMethodCodeId), paymentSummaryDetail.PaymentMethodCodeId, paymentSummaryDetail.CompanyPaymentPackage)); } else { //this get executed by a user when changing the package during Agent down or on package virtual end date or during a gap filling execution // currentCompanyPaymentPackage will always be the existing package. DateTime startDate, tempNextCycleDate = endDate; while (tempNextCycleDate <= dateToConsider) { if (tempNextCycleDate == dateToConsider && paymentSummaryDetail.IsUserAction) { break; } //Find the next Package Start Date based on the duration startDate = tempNextCycleDate; tempNextCycleDate = currentCompanyPaymentPackage.PaymentDurationCodeId == anualDurationCodeId?tempNextCycleDate.AddYears(1) : tempNextCycleDate.AddMonths(1); decimal recordTotalAmount = currentTotalAmount; DiscountCodeUsage discountCodeUsage = null; //Get the relavent education or Discount if (currentCompanyPaymentPackage.IsEducationalPackage) { recordTotalAmount = recordTotalAmount * (100 - educationalDiscount) / 100; } else { //Get the DiscountCode Usage for the Day discountCodeUsage = financeBL.GetDiscountCodeUsageByDate(startDate, currentCompanyPaymentPackage.CompanyId); if (discountCodeUsage != null) { recordTotalAmount = financeBL.GetDiscountedAmount(currentCompanyPaymentPackage.CompanyId, recordTotalAmount, currentCompanyPaymentPackage.PaymentDurationCodeId, discountCodeUsage, startDate, tempNextCycleDate); } } if (paymentSummaryDetail.PaymentMethodCodeId != null) { //this will set is monthly agent processed to true for the past records when gap filling if the user has selected the invoice option. summaryList.Add(CreateCompanyPaymentSummary(recordTotalAmount, tempNextCycleDate, paymentSummaryDetail, discountCodeUsage, startDate, tempNextCycleDate, (paymentSummaryDetail.PaymentMethodCodeId == invoiceMethodCodeId), paymentSummaryDetail.PaymentMethodCodeId, currentCompanyPaymentPackage)); } else { summaryList.Add(CreateCompanyPaymentSummary(recordTotalAmount, tempNextCycleDate, paymentSummaryDetail, discountCodeUsage, startDate, tempNextCycleDate, (currentCompanyPaymentPackage.PaymentMethodCodeId != null && currentCompanyPaymentPackage.PaymentMethodCodeId == invoiceMethodCodeId), currentCompanyPaymentPackage.PaymentMethodCodeId, currentCompanyPaymentPackage)); } } if (tempNextCycleDate == dateToConsider && paymentSummaryDetail.IsUserAction) //if the user do any pricing plan change on the same summmnary end date, this will calculate amounts according to the new selections { startDate = tempNextCycleDate; tempNextCycleDate = paymentSummaryDetail.PaymentDurationTypeCodeId == anualDurationCodeId?tempNextCycleDate.AddYears(1) : tempNextCycleDate.AddMonths(1); decimal recordTotalAmount = newTotalAmount; if (paymentSummaryDetail.PaymentDurationTypeCodeId == anualDurationCodeId) { recordTotalAmount = newInventoryPaymentPackageDetails.AnualAmount + newProjectPaymentPackageDetails.AnualAmount; } else { recordTotalAmount = newInventoryPaymentPackageDetails.Amount + newProjectPaymentPackageDetails.Amount; } //Get the relevant education or Discount if (paymentSummaryDetail.IsEducationPackage) { recordTotalAmount = recordTotalAmount * (100 - educationalDiscount) / 100; } else if (paymentSummaryDetail.DiscountCodeUsageToApply != null) { recordTotalAmount = financeBL.GetDiscountedAmount(paymentSummaryDetail.CompanyId, recordTotalAmount, paymentSummaryDetail.PaymentDurationTypeCodeId, paymentSummaryDetail.DiscountCodeUsageToApply, startDate, tempNextCycleDate); } summaryList.Add(CreateCompanyPaymentSummary(recordTotalAmount, tempNextCycleDate, paymentSummaryDetail, paymentSummaryDetail.DiscountCodeUsageToApply, startDate, tempNextCycleDate, paymentSummaryDetail.PaymentMethodCodeId != null && paymentSummaryDetail.PaymentMethodCodeId == invoiceMethodCodeId, paymentSummaryDetail.PaymentMethodCodeId, paymentSummaryDetail.CompanyPaymentPackage)); } if (paymentSummaryDetail.HasPackageChanged && dateToConsider > endDate) // user upgrade after the yearly cycle (Calculcate Pro rata) { dateDifference = (int)(tempNextCycleDate - dateToConsider).TotalDays; totalDue = GetProrataAmount(paymentSummaryDetail, currentCompanyPaymentPackage, summaryList.Count() > 0 ? summaryList.Last().DiscountCodeUsage : null, newTotalAmount, currentTotalAmount, tempNextCycleDate, dateDifference); summaryList.Add(CreateCompanyPaymentSummary(totalDue, tempNextCycleDate, paymentSummaryDetail, paymentSummaryDetail.DiscountCodeUsageToApply, dateToConsider, tempNextCycleDate, paymentSummaryDetail.PaymentMethodCodeId != null && paymentSummaryDetail.PaymentMethodCodeId == invoiceMethodCodeId, paymentSummaryDetail.PaymentMethodCodeId, paymentSummaryDetail.CompanyPaymentPackage)); } } } return(summaryList); }
/// <summary> /// Saves the creadit fatzibra card token. /// </summary> /// <param name="ucCreditCardDetails">The credit card details control.</param> /// <param name="commit">if set to <c>true</c> [commit to database].</param> private void SaveCreaditCardToken(CreditCardDetails ucCreditCardDetails, bool commit) { // If credit card not validated if (Response == null) { ValidateCardDetails(ucCreditCardDetails); } if (Response != null && Response.Successful) { #region Update existing token details if available CreditCardToken creditCardToken = GetCreditCardToken(); if (creditCardToken != null) { creditCardToken.IsActive = false; creditCardToken.LastUpdatedBy = UserID; creditCardToken.LastUpdatedDate = Now; } #endregion Update existing token details if available #region Add New token details CreditCardToken newCreditCardToken = new CreditCardToken(); newCreditCardToken.Token = Utils.EncryptStringAES(Response.Result.ID); newCreditCardToken.CreatedBy = UserID; newCreditCardToken.LastUpdatedBy = UserID; newCreditCardToken.LastUpdatedDate = Now; newCreditCardToken.CreatedDate = Now; newCreditCardToken.IsActive = true; newCreditCardToken.RelatedTableName = RelatedTable; newCreditCardToken.RelatedId = CompanyId; creditCardNumber = ucCreditCardDetails.CreditCardNumber; newCreditCardToken.LastFourDigitsCreditCardNumber = Utils.EncryptStringAES(creditCardNumber.Substring(creditCardNumber.Length - 4)); DataContext.CreditCardTokens.AddObject(newCreditCardToken); #endregion Add New token details #region Check the company status and reactivate it var company = GetBL <CompanyBL>().GetCompany(CompanyId); if (company != null) { CompanyStatusHandler.CompanyWarningInfo warningInfo = CompanyStatusHandler.GetCompanyWarningStatus(CompanyId, company.CompanyStatusCodeId, company.ExpirationDate); if (warningInfo.WarningStatus == CompanyStatusHandler.CompanyWarningStatus.SuspendedForNoPaymentOptions) { CompanyPaymentPackage companyPaymentPackage = GetBL <FinanceBL>().GetCurrentPaymentPackageFortheCompanyIncludingFreeTrial(company.CompanyId); companyPaymentPackage.PaymentMethodCodeId = Support.GetCodeIdByCodeValue("PaymentMethod", "CREDITCARD"); company.CompanyStatusCodeId = Support.GetCodeIdByCodeValue("CompanyStatus", "ACTIVE"); //update if there is summary for the period CompanyPaymentSummary companyPaymentSummary = this.GetBL <FinanceBL>().GetPaymentSummaryToShouldProcess(company.CompanyId); if (companyPaymentSummary != null) { companyPaymentSummary.ShouldProcess = true; } } } #endregion Check the company status and reactivate it if (commit) { DataContext.SaveChanges(); } ucCreditCardDetails.ClearValues(); if (DisplayMode == ViewMode.CompanyBilling) { ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "HideDiv", "HidePaymentSuccessMessage();", true); } popupConfirmPaymentDetails.HidePopup(); } else { StringBuilder sb = new StringBuilder(); if (Response != null && Response.Errors.Count > 0) { sb.Append(string.Join("<br />", Response.Errors)); ucCreditCardDetails.SetNotification(sb.ToString().Length == 0 ? "Failed to set up payment details. Please verify the payment details and retry" : sb.ToString()); } popupConfirmPaymentDetails.ShowPopup(); } }