/// <summary> /// Handles the Click event of the lnkbtnPayNow control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void lnkbtnPayNow_Click(object sender, EventArgs e) { CreditCardToken companyCreditCardToken = FinanceSupport.GetCreditCardToken("Company", CompanyId); //Check whether payments are setup and display message if required. if (companyCreditCardToken == null) { popupNotification.Title = "Set up Payments"; ltrlNotification.Text = "Please set up payment details for the Company in order to make payments."; popupNotification.ShowPopup(); return; } popupMakePayment.ShowPopup(); }
/// <summary> /// Handles the NeedDataSource event of the gvProjects control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="Telerik.Web.UI.GridNeedDataSourceEventArgs"/> instance containing the event data.</param> protected void gvProjects_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e) { if (!StopProcessing) { #region Fill global variables required for data binding freeTrialCodeId = Support.GetCodeByValue("ProjectStatus", "FREETRIAL").CodeId; activeCodeId = Support.GetCodeByValue("ProjectStatus", "ACTIVE").CodeId; gracePeriodCodeId = Support.GetCodeByValue("ProjectStatus", "GRACEPERIOD").CodeId; paymentFailed = Support.GetCodeByValue("ProjectStatus", "PAYMENTFAILED").CodeId; suspendCodeId = Support.GetCodeByValue("ProjectStatus", "SUSPENDED").CodeId; closedCodeId = Support.GetCodeByValue("ProjectStatus", "CLOSED").CodeId; companyCreditCardToken = FinanceSupport.GetCreditCardToken("Company", CompanyId); #endregion Fill global variables required for data binding switch (ProjectsDisplayMode) { case ProjectsViewMode.ActiveProjects: projectStatusList.Add(freeTrialCodeId); projectStatusList.Add(activeCodeId); projectStatusList.Add(gracePeriodCodeId); projectStatusList.Add(paymentFailed); projectStatusList.Add(suspendCodeId); break; case ProjectsViewMode.ClosedProjects: projectStatusList.Add(closedCodeId); break; case ProjectsViewMode.AllProjects: projectStatusList.Add(freeTrialCodeId); projectStatusList.Add(activeCodeId); projectStatusList.Add(gracePeriodCodeId); projectStatusList.Add(paymentFailed); projectStatusList.Add(suspendCodeId); projectStatusList.Add(closedCodeId); break; } List <CompanyProjectDetails> projects = this.GetBL <FinanceBL>().GetCompanyProjectDetails(CompanyId, projectStatusList); gvProjects.DataSource = projects; } }
/// <summary> /// Loads the data. /// </summary> public void LoadData() { StageBitz.Data.Project project = DataContext.Projects.Where(p => p.ProjectId == ProjectID).FirstOrDefault(); bool paymentsSpecified = (FinanceSupport.GetCreditCardToken("Company", project.CompanyId) != null); ProjectStatusHandler.ProjectWarningInfo warningInfo = ProjectStatusHandler.GetProjectWarningStatus(project.ProjectStatusCodeId, project.ProjectTypeCodeId == Support.GetCodeByValue("ProjectType", "FREETRIALOPTIN").CodeId, project.ExpirationDate); StageBitz.Data.User companyAdmin = this.GetBL <CompanyBL>().GetCompanyPrimaryAdministrator(project.CompanyId); ProjectName = Support.TruncateString(project.ProjectName, 30); RemainingDays = string.Format("{0} day{1}", warningInfo.DaysToExpiration < 0 ? 0 : warningInfo.DaysToExpiration, warningInfo.DaysToExpiration == 1 ? string.Empty : "s"); CompanyAdminName = Support.TruncateString((companyAdmin.FirstName + " " + companyAdmin.LastName).Trim(), 30); CompanyAdminEmail = companyAdmin.Email1; PaymentFailedDate = null; CompanyFinancialUrl = ResolveUrl(string.Format("~/Company/CompanyFinancialDetails.aspx?companyid={0}", project.CompanyId)); if (warningInfo.WarningStatus == ProjectStatusHandler.ProjectWarningStatus.NoWarning) { noticesMultiView.Visible = false; return; } else { noticesMultiView.Visible = true; } #region Determine User Permission Type ProjectPermission userType = ProjectPermission.Staff; if (Support.IsCompanyAdministrator(project.CompanyId)) { userType = ProjectPermission.CompanyAdministrator; } else if (Support.IsProjectAdministrator(ProjectID)) { userType = ProjectPermission.ProjectAdministrator; } else { userType = ProjectPermission.Staff; } #endregion Determine User Permission Type switch (warningInfo.WarningStatus) { case ProjectStatusHandler.ProjectWarningStatus.FreeTrialGrace: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.FreeTrialGraceCompanyAdmin; } break; case ProjectStatusHandler.ProjectWarningStatus.GracePeriod: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.GracePeriodCompanyAdmin; ucCompanyPaymentFailedWarningGracePeriodCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningGracePeriodCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.CompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailedGracePeriod); } else if (userType == ProjectPermission.ProjectAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.GracePeriodProjectAdmin; ucCompanyPaymentFailedWarningGracePeriodNonCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningGracePeriodNonCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.NonCompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailedGracePeriod); } PaymentFailedDate = project.ExpirationDate.Value.AddDays(-7); break; case ProjectStatusHandler.ProjectWarningStatus.PaymentFailed: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.PaymentFailedCompanyAdmin; ucCompanyPaymentFailedWarningPaymentFailedCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningPaymentFailedCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.CompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailed); } else if (userType == ProjectPermission.ProjectAdministrator || userType == ProjectPermission.Staff) { noticesMultiView.ActiveViewIndex = (int)NoticeType.PaymentFailedProjectStaff; ucCompanyPaymentFailedWarningPaymentFailedNonCompanyAdmin.CompanyID = project.CompanyId; ucCompanyPaymentFailedWarningPaymentFailedNonCompanyAdmin.LoadData(CompanyPaymentFailedWarning.PermissionLevel.NonCompanyAdministrator, CompanyPaymentFailedWarning.DisplayMode.PaymentFailed); } break; case ProjectStatusHandler.ProjectWarningStatus.Suspended: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.SuspendedCompanyAdmin; } else if (userType == ProjectPermission.ProjectAdministrator || userType == ProjectPermission.Staff) { noticesMultiView.ActiveViewIndex = (int)NoticeType.SuspendedProjectStaff; } break; case ProjectStatusHandler.ProjectWarningStatus.Closed: if (userType == ProjectPermission.CompanyAdministrator) { noticesMultiView.ActiveViewIndex = (int)NoticeType.ClosedProjectCompanyAdmin; } break; } //If the project's payment has failed, calculate the number of days the payment is due. if (PaymentFailedDate != null) { int paymentOverdueDays = (int)(Today - PaymentFailedDate.Value).TotalDays; PaymentOverdueDays = string.Format("{0} day{1}", paymentOverdueDays, paymentOverdueDays == 1 ? string.Empty : "s"); } upnlProjectWarningDisplay.Update(); }
private void LoadData() { StageBitz.Data.Company company = DataContext.Companies.Where(c => c.CompanyId == CompanyId).FirstOrDefault(); #region Header Details Support.AssignTextToLabel(lblCompanyName, company.CompanyName, 80); if (company.CreatedByUserId == null) { lblCreatedBy.Text = "System"; } else { StageBitz.Data.User user = DataContext.Users.Where(u => u.UserId == company.CreatedByUserId).FirstOrDefault(); string userFullName = (user.FirstName + " " + user.LastName).Trim(); Support.AssignTextToLabel(lblCreatedBy, userFullName, 80); } ltrlCreatedDate.Text = Support.FormatDate(company.CreatedDate); int invoiceFailedCodeId = Utils.GetCodeIdByCodeValue("InvoiceStatus", "FAILED"); //Check if there any pending invoice exist int paymentFailedInvoiceCount = (from i in DataContext.Invoices join p in DataContext.Projects on i.RelatedID equals p.ProjectId where i.RelatedTableName == "Project" && i.InvoiceStatusCodeId == invoiceFailedCodeId && p.CompanyId == CompanyId select i).Count(); if (paymentFailedInvoiceCount == 1) { imgPaymentError.Attributes.Add("Title", "There is a project with a payment failure."); } else if (paymentFailedInvoiceCount > 1) { imgPaymentError.Attributes.Add("Title", "There are projects with payment failures."); } else if (FinanceSupport.GetCreditCardToken("Company", CompanyId) == null) { imgPaymentError.Attributes.Add("Title", "Credit card details not provided."); } else { imgPaymentError.Visible = false; } #endregion #region Contact Details int truncateLength = 30; Support.AssignTextToLabel(lblAddressLine1, company.AddressLine1, truncateLength); Support.AssignTextToLabel(lblAddressLine2, company.AddressLine2, truncateLength); Support.AssignTextToLabel(lblCity, company.City, truncateLength); Support.AssignTextToLabel(lblState, company.State, truncateLength); Support.AssignTextToLabel(lblPostCode, company.PostCode, truncateLength); if (company.Country != null) { Support.AssignTextToLabel(lblCountry, company.Country.CountryName, truncateLength); } Support.AssignTextToLabel(lblPhone, company.Phone, truncateLength); Support.AssignTextToLabel(lblWebsite, company.Website, truncateLength); #endregion SetCompanySuspensionCheckBox(); LoadCompanyAdministrators(); }
/// <summary> /// Processes the invoice. /// </summary> /// <param name="invoice">The invoice.</param> /// <param name="company">The company.</param> /// <param name="dataContext">The data context.</param> /// <returns></returns> private static bool ProcessInvoice(Invoice invoice, Data.Company company, StageBitzDB dataContext) { bool isSuccess = true; try { //Get the Payment History record which has not sent to the payment gateway. PaymentLog paymentLog = dataContext.PaymentLogs.Where(pl => pl.RelatedTableName == "Invoice" && pl.RelatedId == invoice.InvoiceID && pl.IsSentToPaymentGateway == false).FirstOrDefault(); //Get the TokenID of the Company to pass over to Payment gateway. CreditCardToken creditCardToken = (from ct in dataContext.CreditCardTokens where ct.RelatedTableName == "Company" && ct.RelatedId == company.CompanyId && ct.IsActive == true select ct).FirstOrDefault(); bool isPaymentSuccess = false; if (creditCardToken != null) { paymentLog.ReferenceNumber = Utils.GetSystemValue("ReferenceNumberPrefix") + paymentLog.PaymentLogId; //Make the payment via the payment gateway. //Multuply by 100 to send over to FatZebra. //Utils.DecryptStringAES(creditCardToken.Token) var response = Purchase.Create((int)(invoice.Amount * 100), Utils.DecryptStringAES(creditCardToken.Token), null, paymentLog.ReferenceNumber, Utils.GetSystemValue("SBServerIPAddress")); isPaymentSuccess = response.Successful && response.Result != null && response.Result.Successful; if (isPaymentSuccess) { //Update Invoice as Processed. invoice.InvoiceStatusCodeId = Utils.GetCodeByValue("InvoiceStatus", "PROCESSED").CodeId; //Create Receipt for the Invoice FinanceSupport.CreateReceipt(company.CompanyId, "Company", string.Format("Payment for Company {0}", company.CompanyName), invoice.Amount, invoice.Transaction.TransactionID, dataContext); } else { //Update Invoice as Failed. invoice.InvoiceStatusCodeId = Utils.GetCodeByValue("InvoiceStatus", "FAILED").CodeId; } //Update the Payment History record as Sent to payment gateway. paymentLog.IsSentToPaymentGateway = true; paymentLog.IsPaymentSuccess = isPaymentSuccess; if (response.Result != null) { paymentLog.ResponseId = response.Result.ID; } paymentLog.Description = GetPaymentGatewayLogDescription(response); paymentLog.CreditCardTokenId = creditCardToken.CreditCardTokenID; } else { paymentLog.Description = "Credit card details not provided."; //Update Invoice as Failed. invoice.InvoiceStatusCodeId = Utils.GetCodeByValue("InvoiceStatus", "FAILED").CodeId; } invoice.LastUpdateDate = Utils.Now; invoice.LastUpdatedBy = 0; paymentLog.LastUpdatedDate = Utils.Now; paymentLog.LastUpdatedByUserId = 0; isSuccess = isPaymentSuccess; } catch (Exception ex) { AgentErrorLog.WriteToErrorLog("Failed to Process the Invoice for CompanyId " + invoice.RelatedID); AgentErrorLog.HandleException(ex); isSuccess = false; } return(isSuccess); }
/// <summary> /// This is to be called by monthly agent and manual payment. /// </summary> public static bool ProcessInvoicesAndPayments(int companyId, DateTime dateToConsider, bool shouldCreateInvoices, int userId) { using (StageBitzDB dataContext = new StageBitzDB()) { FinanceSupport.InitializePaymentSettings(); bool isPaymentSuccess = false; bool isManualPayment = (companyId == 0) ? false : true; List <Invoice> invoiceList = new List <Invoice>(); if (shouldCreateInvoices) { List <CompanyPaymentSummary> unProcessedPaymentSummaries = GetUnProcessedCompanyPaymentSummaries(0, dataContext, dateToConsider); //Only consider companies which has payment packages List <Data.Company> companies = (from c in dataContext.Companies join cpp in dataContext.CompanyPaymentPackages on c.CompanyId equals cpp.CompanyId select c).Distinct().ToList(); if (unProcessedPaymentSummaries.Count > 0) { CompanyBL companyBL = new CompanyBL(dataContext); foreach (Data.Company company in companies) { try { List <CompanyPaymentSummary> unProcessedCompanyPaymentSummaries = unProcessedCompanyPaymentSummaries = unProcessedPaymentSummaries.Where(upcs => upcs.CompanyId == company.CompanyId).OrderBy(ups => ups.CompanyPaymentSummaryId).ToList(); //*******Consider payment summaries for the company********* if (unProcessedCompanyPaymentSummaries != null && unProcessedCompanyPaymentSummaries.Count() > 0) { if (!companyBL.IsFreeTrialCompany(company.CompanyId, dateToConsider)) { decimal totalAmount = unProcessedCompanyPaymentSummaries.Sum(ups => ups.Amount); DateTime fromDate = unProcessedCompanyPaymentSummaries.First().FromDate; DateTime toDate = unProcessedCompanyPaymentSummaries.Last().ToDate; Invoice invoice = null; if (totalAmount > 0) //generate the invoice only if there is a due amount to pay { invoice = FinanceSupport.CreateInvoice(company.CompanyId, "Company", "PACKAGEFEE", string.Format("Payment for Company {0}", company.CompanyName), decimal.Round(totalAmount, 2), fromDate, toDate, dataContext); } foreach (CompanyPaymentSummary companyPackagePaymentSummary in unProcessedCompanyPaymentSummaries) { companyPackagePaymentSummary.IsMonthlyAgentProcessed = true; if (invoice != null) { companyPackagePaymentSummary.Invoice = invoice; } companyPackagePaymentSummary.LastUpdatedDate = Utils.Today; companyPackagePaymentSummary.LastUpdatedBy = 0; } } } } catch (Exception ex) { AgentErrorLog.WriteToErrorLog("Failed to create Invoice for projectId" + company.CompanyId); AgentErrorLog.HandleException(ex); isPaymentSuccess = false; } } //Complete upto now. dataContext.SaveChanges(); } //Get all the Unprocessed Invoices to send to the payment gateway. invoiceList = FinanceSupport.GetUnProcessedInvoicesByRelatedTable("Company", companyId, "PACKAGEFEE", dataContext); } else { int companyStatusCodeID = 0; if (!isManualPayment) { //Not Manual means, Payment Retry. companyStatusCodeID = Utils.GetCodeByValue("CompanyStatus", "GRACEPERIOD").CodeId; } //Get all the Unprocessed Invoices to send to the payment gateway. //For Grace period payment Retry process projectId is 0. invoiceList = FinanceSupport.GetPaymentFailedInvoices("PACKAGEFEE", companyStatusCodeID, companyId, "Company", dataContext); } //Because we need Payment Log records before process Invoices. foreach (Invoice invoice in invoiceList) { FinanceSupport.CreatePaymentLog(invoice.InvoiceID, dataContext); } dataContext.SaveChanges(); //Get distinct company Ids within the unprocessed invoice list var companyIds = invoiceList.Select(inv => inv.RelatedID).Distinct(); foreach (int distinctCompanyId in companyIds) { isPaymentSuccess = ProcessInvoicesByCompany(invoiceList, distinctCompanyId, isManualPayment, dataContext); if (isPaymentSuccess) { CompanyBL companyBL = new CompanyBL(dataContext); companyBL.ActivateUnProcessedSummaries(distinctCompanyId, userId); } } dataContext.SaveChanges(); //For the Monthly Agent Runner the return value is not important but for the manual payment. return(isPaymentSuccess); } }