public ActionResult ContributionStatements(bool?pdf, DateTime?fromDate, DateTime?endDate, string startswith) { if (!fromDate.HasValue || !endDate.HasValue) { return(Content("<h3>Must have a Startdate and Enddate</h3>")); } var runningtotals = new ContributionsRun { Started = DateTime.Now, Count = 0, Processed = 0 }; if (!startswith.HasValue()) { startswith = null; } DbUtil.Db.ContributionsRuns.InsertOnSubmit(runningtotals); DbUtil.Db.SubmitChanges(); var cul = DbUtil.Db.Setting("Culture", "en-US"); var host = Util.Host; var output = Output(pdf); System.Threading.Tasks.Task.Factory.StartNew(() => { Thread.CurrentThread.Priority = ThreadPriority.Lowest; Thread.CurrentThread.CurrentUICulture = new CultureInfo(cul); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cul); var m = new ContributionStatementsExtract(host, fromDate.Value, endDate.Value, pdf ?? false, output, startswith); m.DoWork(); }); return(Redirect("/Statements/Progress")); }
public ActionResult ContributionStatements(DateTime?fromDate, DateTime?endDate, string startswith, string sort, int?tagid, bool excludeelectronic, string customstatement = null, bool exportcontributors = false) { if (!fromDate.HasValue || !endDate.HasValue) { return(Content("<h3>Must have a Startdate and Enddate</h3>")); } var runningtotals = new ContributionsRun { Started = DateTime.Now, Count = 0, Processed = 0 }; var cs = Models.Report.ContributionStatements.GetStatementSpecification(customstatement); if (!startswith.HasValue()) { startswith = null; } if (exportcontributors) { var db = DbUtil.Db; var noaddressok = !db.Setting("RequireAddressOnStatement", true); const bool useMinAmt = true; if (tagid == 0) { tagid = null; } var qc = APIContribution.Contributors(db, fromDate.Value, endDate.Value, 0, 0, 0, cs.Funds, noaddressok, useMinAmt, startswith, sort, tagid: tagid, excludeelectronic: excludeelectronic); return(ExcelExportModel.ToDataTable(qc.ToList()).ToExcel("Contributors.xlsx")); } DbUtil.Db.ContributionsRuns.InsertOnSubmit(runningtotals); DbUtil.Db.SubmitChanges(); var cul = DbUtil.Db.Setting("Culture", "en-US"); var host = Util.Host; var output = Output(); if (tagid == 0) { tagid = null; } HostingEnvironment.QueueBackgroundWorkItem(ct => { Thread.CurrentThread.CurrentUICulture = new CultureInfo(cul); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cul); var m = new ContributionStatementsExtract(host, fromDate.Value, endDate.Value, output, startswith, sort, tagid, excludeelectronic); m.DoWork(cs); }); return(Redirect("/Statements/Progress")); }
public ActionResult ContributionStatements(DateTime?fromDate, DateTime?endDate, string startswith, string sort, int?tagid, bool excludeelectronic) { if (!fromDate.HasValue || !endDate.HasValue) { return(Content("<h3>Must have a Startdate and Enddate</h3>")); } var runningtotals = new ContributionsRun { Started = DateTime.Now, Count = 0, Processed = 0 }; if (!startswith.HasValue()) { startswith = null; } DbUtil.Db.ContributionsRuns.InsertOnSubmit(runningtotals); DbUtil.Db.SubmitChanges(); var cul = DbUtil.Db.Setting("Culture", "en-US"); var host = Util.Host; var output = Output(); if (tagid == 0) { tagid = null; } HostingEnvironment.QueueBackgroundWorkItem(ct => { Thread.CurrentThread.CurrentUICulture = new CultureInfo(cul); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cul); var m = new ContributionStatementsExtract(host, fromDate.Value, endDate.Value, output, startswith, sort, tagid, excludeelectronic); m.DoWork(); }); return(Redirect("/Statements/Progress")); }
private void HtmlToPdfMethod(Stream stream, CMSDataContext db, IEnumerable <ContributorInfo> q, StatementSpecification cs, int set) { IConverter converter = GetConverter(); string nameOfChurch = db.Setting("NameOfChurch", "Name of Church"); string startAddress = db.Setting("StartAddress", "Start Address"); string churchPhone = db.Setting("ChurchPhone", "(000) 000-0000"); string html = cs.Template ?? db.Content("StatementTemplate", Resource1.ContributionStatementTemplate, ContentTypeCode.TypeText).Body; string bodyHtml = cs.TemplateBody ?? db.Content("StatementTemplateBody", Resource1.ContributionStatementTemplateBody, ContentTypeCode.TypeText).Body; string header = cs.Header ?? db.Content("StatementHeader", string.Format(Resource1.ContributionStatementHeader, nameOfChurch, startAddress, churchPhone), ContentTypeCode.TypeHtml).Body; string notice = cs.Notice ?? db.Content("StatementNotice", string.Format(Resource1.ContributionStatementNotice, nameOfChurch), ContentTypeCode.TypeHtml).Body; string footer = cs.Footer ?? db.Content("StatementTemplateFooter", "", ContentTypeCode.TypeText).Body; ContributionsRun runningtotals = db.ContributionsRuns.Where(mm => mm.UUId == UUId).SingleOrDefault(); StatementOptions options; if (!GetStatementOptions(bodyHtml, out options)) { GetStatementOptions(html, out options); } var toDate = ToDate.Date.AddHours(24).AddSeconds(-1); var document = new HtmlToPdfDocument { GlobalSettings = { DocumentTitle = (cs.Description ?? "Contribution Statement {date}").Replace("{date}", $"{toDate:d}"), Margins = options.Margins.Settings, PaperSize = options.PaperSize, ProduceOutline = false, } }; var familiesInSet = pageEvents.FamilySet.Where(k => k.Value == set).Select(k => k.Key); var contributors = q.Where(c => set == 0 || familiesInSet.Contains(c.FamilyId)); var count = contributors.Count(); if (count == 0) { document.Objects.Add(new ObjectSettings { HtmlText = @"<p>no data</p> <a href=""https://docs.touchpointsoftware.com/Finance/ContributionStatements.html#troubleshooting""> See this help document docs.touchpointsoftware.com/Finance/ContributionStatements.html </a>" }); var bytes = converter.Convert(document); stream.Write(bytes, 0, bytes.Length); return; } if (runningtotals != null) { runningtotals.Processed = 0; } db.SubmitChanges(); Document combinedPDF = new Document(); var combinedPDFName = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.pdf"); using (FileStream combinedStream = new FileStream(combinedPDFName, FileMode.Create)) { using (PdfCopy writer = new PdfCopy(combinedPDF, combinedStream)) { combinedPDF.Open(); var lastFamilyId = 0; foreach (var contributor in contributors) { if (runningtotals != null) { runningtotals.Processed += 1; runningtotals.CurrSet = set; db.SubmitChanges(); } if (lastFamilyId != contributor.FamilyId) { lastFamilyId = contributor.FamilyId; if (set == 0) { pageEvents.FamilySet[contributor.FamilyId] = 0; } } var contributions = APIContribution.Contributions(db, contributor, FromDate, toDate, cs.Funds).ToList(); var pledges = APIContribution.Pledges(db, contributor, toDate, cs.Funds).ToList(); var giftsinkind = APIContribution.GiftsInKind(db, contributor, FromDate, toDate, cs.Funds).ToList(); var nontaxitems = APIContribution.NonTaxItems(db, contributor, FromDate, toDate, cs.Funds).ToList(); if ((contributions.Count + pledges.Count + giftsinkind.Count + nontaxitems.Count) > 0) { contributor.MailingAddress = string.Join("<br/>", contributor.MailingAddress.SplitLines()); var taxSummary = SumByFund(contributions); var nontaxSummary = SumByFund(nontaxitems.Select(i => new NormalContribution(i)).ToList()); if (options.CombinedTaxSummary) { taxSummary.Combine(SumByFund(giftsinkind.Select(i => new NormalContribution(i)).ToList())); } var data = new StatementContext { fromDate = FromDate, toDate = toDate, header = "", notice = "", now = DateTime.Now, body = "", footer = "", contributor = contributor, envelopeNumber = Convert.ToString(Person.GetExtraValue(db, contributor.PeopleId, "EnvelopeNumber")?.IntValue), contributions = new ListOfNormalContributions(contributions), pledges = pledges, giftsinkind = giftsinkind, nontaxitems = nontaxitems, taxSummary = taxSummary, nontaxSummary = nontaxSummary, totalGiven = taxSummary.Total + nontaxSummary.Total }; data.header = db.RenderTemplate(header, data); data.notice = db.RenderTemplate(notice, data); data.body = db.RenderTemplate(bodyHtml, data); data.footer = db.RenderTemplate(footer, data); var htmlDocument = db.RenderTemplate(html, data); document.Objects.Clear(); document.Objects.Add(new ObjectSettings { CountPages = true, FooterSettings = options.Footer.Settings, HeaderSettings = options.Header.Settings, HtmlText = htmlDocument, WebSettings = new WebSettings { EnableJavascript = false, PrintBackground = true }, LoadSettings = new LoadSettings { BlockLocalFileAccess = true } }); } else { continue; } var bytes = converter.Convert(document); var pageCount = 0; using (PdfReader reader = new PdfReader(bytes)) { pageCount = reader.NumberOfPages; for (int p = 0; p < pageCount; p++) { var page = writer.GetImportedPage(reader, p + 1); writer.AddPage(page); } } if (set == 0) { pageEvents.FamilySet[contributor.FamilyId] += pageCount; } } } } using (var combined = File.OpenRead(combinedPDFName)) { combined.CopyTo(stream); } }
public ActionResult ContributionStatements(DateTime?fromDate, DateTime?endDate, string startswith, string sort, int?tagid, bool excludeelectronic, string customstatement = null, bool exportcontributors = false) { if (!fromDate.HasValue || !endDate.HasValue) { return(Content("<h3>Must have a Startdate and Enddate</h3>")); } if (fromDate.Value > endDate.Value) { return(Content("<h3>The Startdate must be earlier than the Enddate</h3>")); } var spec = ContributionStatementsExtract.GetStatementSpecification(CurrentDatabase, customstatement); if (!startswith.HasValue()) { startswith = null; } var noaddressok = !CurrentDatabase.Setting("RequireAddressOnStatement", true); const bool useMinAmt = true; if (tagid == 0) { tagid = null; } var qc = APIContribution.Contributors(CurrentDatabase, fromDate.Value, endDate.Value, 0, 0, 0, spec.Funds, noaddressok, useMinAmt, startswith, sort, tagid: tagid, excludeelectronic: excludeelectronic); var contributors = qc.ToList(); if (exportcontributors) { return(ExcelExportModel.ToDataTable(contributors).ToExcel("Contributors.xlsx")); } var statementsRun = new ContributionsRun { Started = DateTime.Now, Count = contributors.Count, Processed = 0, UUId = Guid.NewGuid(), UserId = CurrentDatabase.UserId, }; CurrentDatabase.ContributionsRuns.InsertOnSubmit(statementsRun); CurrentDatabase.SubmitChanges(); var cul = CurrentDatabase.Setting("Culture", "en-US"); var host = CurrentDatabase.Host; var id = $"{statementsRun.UUId:n}"; var output = Output(host, id); if (tagid == 0) { tagid = null; } var showCheckNo = CurrentDatabase.Setting("RequireCheckNoOnStatement"); var showNotes = CurrentDatabase.Setting("RequireNotesOnStatement"); var statements = new ContributionStatements { UUId = Guid.Parse(id), FromDate = fromDate.Value, ToDate = endDate.Value, typ = 3, //TODO: once we switch to entirely html-based statement templates we won't need to check for these options NumberOfColumns = showCheckNo || showNotes ? 1 : 2, ShowCheckNo = showCheckNo, ShowNotes = showNotes, }; if (CurrentDatabase.Setting("UseNewStatementsFormat")) { // Must do this before entering the background worker because it relies on the Application context statements.GetConverter(); } var elmah = Elmah.ErrorLog.GetDefault(System.Web.HttpContext.Current); HostingEnvironment.QueueBackgroundWorkItem(ct => { Thread.CurrentThread.CurrentUICulture = new CultureInfo(cul); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cul); try { var m = new ContributionStatementsExtract(host, fromDate.Value, endDate.Value, output, startswith, sort, tagid, excludeelectronic) { id = id }; m.DoWork(statements, spec, contributors); } catch (Exception e) { elmah.Log(new Elmah.Error(e)); var db = CMSDataContext.Create(host); var run = db.ContributionsRuns.Single(c => c.UUId == Guid.Parse(id)); run.Error = e.Message; run.Completed = DateTime.Now; db.SubmitChanges(); } }); return(Redirect($"/Statements/Progress/{id}")); }