Hello!
Per our last meeting, I wanted to start a thread to hopefully collect some of your custom HTML template examples.
I will start by sharing the one we use for onsite sold Gift Cards, it's slightly better than the out of the box one, but still super basic w/o much other branding yet - We just wanted to add the look of a digital gift card.
I only included the code for the gift card part since the rest was pretty much out of the box, let me know if you have any questions.
Please share with me your HTML templates! We're looking primarily for one that we can build into a copy that will serve as our one HTML template to rule them all sort of thing with all the different situations covered in the code. We're struggling to get started because of missing data in the template/receipt book for things like having the price type of an admission ticket show.
We're using the TNEW Order Confirmation template for now for all purchases except onsite gift cards.
var giftCertificates = (Model.OrderProductView.Products as OrderProductViewProducts).Where(x => x.ProductClass.Description == "Gift Certificate"); var giftCertificateTotal = giftCertificates.Sum(x => -x.GiftCertificate.Amount); if (giftCertificates != null && giftCertificates.Count() > 0) { <tr> <td align="left" valign="top"> <table style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif; text-align: left"> <tr> <th style="background-color: #F15E47; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top"> <b>Gift Certificates</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <table width="700" style="vertical-align: top; text-align: left"> <tr> <th width="600" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #F15E47; text-align: left; vertical-align: top">Description</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #F15E47; text-align: right; vertical-align: top">Total</th> </tr> @foreach (var giftCertificate in giftCertificates) { var amount = -giftCertificate.GiftCertificate.Amount; <tr> <td> <div style=""><br /> <table width="500px" border="0" cellpadding="0" cellspacing="0" style="-ms-text-size-adjust: auto; -webkit-text-size-adjust: 100%; border-collapse: initial !important; font-size: 14px; min-width: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"><tbody><tr id="layout-row8232" class="layout layout-row widget _widget_html style8232" style="mso-line-height-rule: exactly;"><td id="layout-row-padding8232" valign="top" style="mso-line-height-rule: exactly; padding: 0px;"><table width="100%" border="0" cellpadding="0" cellspacing="0" style="-ms-text-size-adjust: auto; -webkit-text-size-adjust: 100%; border-collapse: collapse; font-size: 14px; min-width: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt;"><tbody><tr style="mso-line-height-rule: exactly;"><td id="html_div7633" width="537" align="left" style="mso-line-height-rule: exactly;"> <table style="-ms-text-size-adjust: auto; -webkit-text-size-adjust: 100%; border-collapse: collapse; font-size: 14px; min-width: 100%; mso-table-lspace: 0pt; mso-table-rspace: 0pt; -moz-border-radius: 25px; -webkit-border-radius: 25px; border-color: #1e384b; border-radius: 25px; border-style: dashed; border-width: 3px; display: block; margin: auto; padding: 20px; width: 80%;"><tbody><tr style="mso-line-height-rule: exactly;"><td style="mso-line-height-rule: exactly; padding: 10px;"><img src="https://pjgbudget.japanesegarden.org/images/logo.png" width="100px"></td> <td style="mso-line-height-rule: exactly; padding: 10px;"><p style="font-size: 25px;">Portland Japanese Garden<br />Digital Gift Card</p></td> </tr><tr style="mso-line-height-rule: exactly;"><td style="mso-line-height-rule: exactly; padding: 10px;"><strong style="margin: 0; outline: none; padding: 0;">Gift Card ID#:</strong></td> <td style="mso-line-height-rule: exactly; padding: 10px;"> @giftCertificate.GiftCertificate.GiftCertificateNumber </td> </tr><tr style="mso-line-height-rule: exactly;"><td style="mso-line-height-rule: exactly; padding: 10px;"><strong style="margin: 0; outline: none; padding: 0;">Value on Card:</strong></td> <td style="mso-line-height-rule: exactly; padding: 10px;"> @string.Format("{0:C}", amount) </td> </tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table> </div> </td> <!-- <td> Redemption Code: @giftCertificate.GiftCertificate.GiftCertificateNumber </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", amount) </td>--> </tr> } <tr> <td style="border-top: 1px solid #F15E47; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Total Gift Certificate Cost:</b> </td> <td style="border-top: 1px solid #F15E47; color: #6e6d6d; text-align: right"> <b>@string.Format("{0:C}", giftCertificateTotal)</b> </td> </tr> </table> </td> </tr> </table> </td> </tr> }
Nice job! I love HTML templates, but wanted to make sure people were aware of one thing. In v16 you basically have two choices in regards to TNEW usage. 1. Use TNEWs default confirmation which can not be edited outside of the header and footer, neither of which have any real connection to the API and can not do any database queries. 2. Go full custom. We strongly recommend that organizations use the default option if at all possible, because it ensures we are able to help troubleshoot issues.The TNEW version will basically be a carbon copy of what the patron sees on their confirmation page once they complete their order, including any dynamic information that you've added. As you update any stylization etc. on your TNEW site, your confirmation will automatically inherit those changes.If you go full custom, you will need to update any stylizations both on TNEW and in your custom template. Also, you will need to code in the ability to pull your dynamic text into your custom solution.
Here's our order confirmation html template code. There are some comments throughout, and I wish I had time today to do some more commenting, but I'm getting ready to be out of town next week. Let me know if you have questions about certain parts, and I'll reply after I'm back.
@*using statement required for access to Constituencies object type when making REST call to CRM/Constituencies*@ @using Tessitura.Service.Client.CRM; @using Tessitura.Service.Client.Custom; @using Tessitura.Services.Common.Client.Utils; @using System.Xml; @using System.Xml.Serialization; @using Tessitura.Service.Client.ReferenceData; @using Tessitura.Service.Client.Txn; @*added by Joanna*@ @{ var hasConstituent = Model.OrderProductView.Constituent != null; var hasAddress = Model.Address != null; var hasElectronicAddress = Model.ElectronicAddress != null; var hasBooking = Model.Booking != null; var isInSpecialConstituency = false; var constituencyMessage = Model.GetPropertyValue("ConstituencyMessage") ?? "Thank you for being a part of Friend's Circle!"; var constituency = Model.GetPropertyValue("Constituency") ?? "FRC"; var hasState = hasAddress && Model.Address.State != null; var hasProducts = Model.OrderProductView.Products != null && Model.OrderProductView.Products.Count > 0; var memberships = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {memberships = Model.OrderProductView.Payments.Where(x => x.PaymentMethod.Id == 141); } catch {} // In case of empty payments object (zero dollar transaction) var hasMemberships = memberships != null && memberships.Count() > 0; var MembershipsPaymentsTotal = hasMemberships ? memberships.Sum(x => x.Amount) * -1 : 0; var membershipsProducts = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewProduct>(); try {membershipsProducts = Model.OrderProductView.Products.Where(x => x.Membership.Id > 0); } catch {} bool hasMembershipsProducts; try {hasMembershipsProducts = membershipsProducts != null && membershipsProducts.Count() > 0;} catch {hasMembershipsProducts = false;} // Payment method 553 is for web roundups during purchase var roundUps = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {roundUps = Model.OrderProductView.Payments.Where(x => x.PaymentMethod.Id == 553); } catch {} var hasRoundUps = roundUps != null && roundUps.Count() > 0; var RoundUpsPaymentsTotal = hasRoundUps ? roundUps.Sum(x => x.Amount) * -1 : 0; var roundUpsProducts = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewProduct>(); try {roundUpsProducts = Model.OrderProductView.Products.Where(x => x.Membership.Id > 0); } catch {} bool hasRoundUpsProducts; try {hasRoundUpsProducts = roundUpsProducts != null && roundUpsProducts.Count() > 0;} catch {hasRoundUpsProducts = false;} // Payment method 594 is for seat naming payments var seatName = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {seatName = Model.OrderProductView.Payments.Where(x => x.PaymentMethod.Id == 594); } catch {} var hasSeatName = seatName != null && seatName.Count() > 0; var seatNamePaymentsTotal = hasSeatName ? seatName.Sum(x => x.Amount) * -1 : 0; var seatNameProducts = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewProduct>(); try {seatNameProducts = Model.OrderProductView.Products.Where(x => x.Membership.Id > 0); } catch {} bool hasSeatNameProducts; try {hasSeatNameProducts = seatNameProducts != null && seatNameProducts.Count() > 0;} catch {hasSeatNameProducts = false;} //The definition of a phantom payment, product, etc. is a temporary payment that compensates for a negative value when a patron is exchanging from a more expensive to a less expensive ticket. //The show-specific O.A. payment method is used to create an equal positive payment, so that if a patron makes a donation, the site won't apply the negative ticket balance to their donation. var phantom = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {phantom = Model.OrderProductView.Payments.Where(x => x.PaymentMethod.Id == 237 || x.PaymentMethod.Id == 238 || x.PaymentMethod.Id == 239 || x.PaymentMethod.Id == 240 || x.PaymentMethod.Id == 241 || x.PaymentMethod.Id == 242 || x.PaymentMethod.Id == 243 || x.PaymentMethod.Id == 244); } catch {} var hasPhantom = phantom != null && phantom.Count() > 0; var PhantomPaymentsTotal = hasPhantom ? phantom.Sum(x => x.Amount) * -1 : 0; var phantomProducts = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewProduct>(); try {phantomProducts = Model.OrderProductView.Products.Where(x => x.Membership.Id > 0); } catch {} bool hasPhantomProducts; try {hasPhantomProducts = phantomProducts != null && phantomProducts.Count() > 0;} catch {hasPhantomProducts = false;} var galaProducts = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {galaProducts = Model.OrderProductView.Payments.Where(x => x.PaymentMethod.Id == 545); } catch {} var hasGalaProducts = galaProducts != null && galaProducts.Count() > 0; var state = hasState ? ", " + Model.Address.State.StateCode : ""; var electronicAddress = hasElectronicAddress ? Model.ElectronicAddress.Address : ""; var onAccountPayments = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {onAccountPayments = Model.OrderProductView.Payments.Where(x => x.PaymentMethod.Id != 141 && x.PaymentMethod.AccountType == null && x.LastFourCreditCardNumber == "" && x.GiftCertificateNumber == null && x.Amount > 0); } catch {} // In case of empty payments object (zero dollar transaction) var giftcertificatePayments = Enumerable.Empty<Tessitura.Service.Client.Txn.OrderProductViewPayment>(); try {giftcertificatePayments = Model.OrderProductView.Payments.Where(x => x.GiftCertificateNumber != null && x.Amount > 0); } catch {} var hasgiftcertificatePayments = giftcertificatePayments != null && giftcertificatePayments.Count() > 0; var giftcertificatePaymentsTotal = hasgiftcertificatePayments ? giftcertificatePayments.Sum(x => x.Amount) : 0; var hasOnAccountPayments = onAccountPayments != null && onAccountPayments.Count() > 0; var onAccountPaymentsTotal = hasOnAccountPayments ? onAccountPayments.Sum(x => x.Amount) : 0; } @{ //Determine if the order is Print at Home //This variable will be referenced later bool IsPAH = false; var DeliveryMethodResponse = Model.RestClient.AtUrl("ReferenceData/DeliveryMethods/" + Model.OrderProductView.DeliveryMethod.Id).Get<DeliveryMethod>(); if (DeliveryMethodResponse.IsSuccessful) { IsPAH = DeliveryMethodResponse.ResponseObject.PrintAtHome; } } @if (hasConstituent) { var url = "CRM/Constituencies?constituentId=" + Model.OrderProductView.Constituent.Id + "&includeAffiliations=true"; var constituencies = Model.RestClient.AtUrl(url).Get<Constituencies>().ResponseObject; isInSpecialConstituency = constituencies != null && constituencies.Count(x => x.ConstituencyType.ShortDescription == constituency) > 0; } @{ //Edit these variables as needed string contentTypeIds = "27"; string showAllContent = "false"; var showPerfsInPackages = false; //Start the comma delimited list string perfIdStr = ","; string packIdStr = ","; //Performances in Packages if (Model.OrderProductView.Products != null){ if (showPerfsInPackages) { foreach (var invContentPkgs in Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Package")) { foreach (var invContentPkgSLIs in invContentPkgs.Package.LineItems) { if (invContentPkgSLIs.Performance != null && perfIdStr.Contains("," + invContentPkgSLIs.Performance.Id + ",") == false) { perfIdStr = perfIdStr + invContentPkgSLIs.Performance.Id + ","; } } } } //Performances as Single Tickets foreach (var invContentPerfs in Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Performance")) { if (perfIdStr.Contains("," + invContentPerfs.Performance.LineItem.Performance.Id + ",") == false) { perfIdStr = perfIdStr + invContentPerfs.Performance.LineItem.Performance.Id + ","; } } //Packages foreach (var invContentPkgs in Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Package")) { foreach (var invContentPkgLIs in invContentPkgs.Package.LineItems) { if (invContentPkgLIs.Package != null && packIdStr.Contains("," + invContentPkgLIs.Package.Id + ",") == false) { packIdStr = packIdStr + invContentPkgLIs.Package.Id + ","; } } } } //Trim extra commas perfIdStr = perfIdStr.Trim(','); packIdStr = packIdStr.Trim(','); //Retrieve content string invContentUrl = "TXN/WebContents?contentTypeIds=" + contentTypeIds + "&showAll=" + showAllContent; if (perfIdStr != "") { invContentUrl = invContentUrl + "&productionElementIds=" + perfIdStr; } if (packIdStr != "") { invContentUrl = invContentUrl + "&packageIds=" + packIdStr; } WebContentResults invContentResults = null; if (perfIdStr != "" | packIdStr != "") { invContentResults = Model.RestClient.AtUrl(invContentUrl).Get<WebContentResults>().ResponseObject; } } <html style="margin: 0; padding: 0;"> <head> <meta name="viewport" content="width=device-width,initial-scale=1"> <style> @@media only screen and (max-width: 50em) { .logo-container { padding: 10px 10px 30px !important; } .logo { width: 50px !important; height: 110px !important; } .text-container { padding: 0 15px 15px 0 !important; } .text { max-width: calc(100% - 30px); height: auto; } .performance-title { font-size: 24px !important; } .performance-date { font-size: 14px !important; } .performance-total { font-size: 16px !important; } .fee { font-size: 16px !important; } .basket-total { font-size: 20px !important; } .footer { padding: 20px !important; } .footer-people { font-size: 14px !important; } } </style> </head> <body style="margin: 0; padding: 0;"> <table width="100%" height="100%" margin="0" padding="0" style="background-color: #111; border-collapse: collapse; border-spacing: 0; -webkit-font-smoothing: antialiased;"> <tbody> <tr> <td style="vertical-align: top;"> <!-- Header --> <table align="center" width="100%" style="background-color: #7810bf; border-collapse: collapse; border-spacing: 0;"> <tbody> <tr> <td> <table align="center" width="100%" style="max-width: 600px; background-color: #7810bf; border-collapse: collapse; border-spacing: 0;"> <tbody> <tr> <!-- Logo --> <td class="logo-container" style="padding: 15px 0 31px;"><img class="logo" src="https://blocksoffice.s3-eu-west-1.amazonaws.com/seattlerep-test/seattle-rep-logo.png" width="60px" height="132px" style="display: block;" /></td> <!-- Header Text --> <td class="text-container" style="vertical-align: bottom; text-align: right; color: #fff; font-family: Helvetica, Arial Black, Arial, sans-serif; padding: 0 25px 15px 0; text-align: right;"> <img class="text" src="https://blocksoffice.s3-eu-west-1.amazonaws.com/seattlerep-test/order-confirmation-text.png" height="25px" width="291px" style="display: block; margin-left: auto" /> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <!-- Content --> <table width="100%" style="background-color: #222; border-collapse: collapse; border-spacing: 0;"> <tbody> <!-- Consitutent Info & Order Number --> <tr> <td style="padding-top: 30px;"> <table align="center" width="90%" style="max-width: 600px; border-collapse: collapse; border-spacing: 0;"> <tr> <td style="padding: 10px; background-color: #222; color: #fff; font-family: Helvetica, Arial, sans-serif;"> @if (hasConstituent) { <p style="font-size: 18px; margin: 0 0 4px;"><strong>Name:</strong> @Model.OrderProductView.Constituent.DisplayName<!-- @Model.OrderProductView.Constituent.Id --></p> } <p style="font-size: 18px; margin: 0 0 4px;"><strong>Order Number:</strong> @Model.OrderProductView.Id</p> @if (hasMembershipsProducts) {<p style="font-size: 16px;">Thank you so much for supporting Seattle Rep. We appreciate your patronage! Please keep this e-mail until you receive your acknowledgment letter/tax receipt.</p>} else {<p style="font-size: 16px;">Thank you for your order! We appreciate your patronage.</p>} <!-- @Model.OrderProductView.OrderDateTime --> @if (hasProducts) { if (invContentResults != null && invContentResults.Count() > 0) { foreach(var invContentResult in invContentResults) { foreach(var invContent in invContentResult.WebContents) { <tr><td style="padding: 10px; background-color: #222; color: #fff; font-family: Helvetica, Arial, sans-serif;">@Raw(invContent.Value)</td></tr> } } } } </td> </tr> </table> </td> </tr> <!-- Order Details --> <tr style="background-color: #222;"> <td style="padding: 0 30px 0;"> <table align="center" width="90%" style="max-width: 600px; border-collapse: collapse; border-spacing: 0;"> <tbody> @if (hasProducts) { /* PERFORMANCES */ var perfs = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Performance"); int [] playersPackVenueId = {5}; int playersPackPriceTypeId = 400; int [] playersPackVouchersLineItemIds = {}; int streamCompPricetypeID = 108; int streamPaidPricetypeID = 425; if (perfs != null && perfs.Count() > 0) { foreach (var product in perfs) { var performance = product.Performance.LineItem.Performance; /* CODE FOR WEB CONTENT FIELD TITLE START */ var PerformanceId = performance.Id; IRestResponse<string> response = null; var url = "TXN/WebContents?productionElementIds=" + PerformanceId + "&contentTypeIds=3&showAll=true"; response = Model.RestClient.AtUrl(url).Get<string>(); var errorMessages = response.ErrorMessages; string xpath = "WebContentResults/WebContentResult//Value[1]"; var PerformanceTitle = performance.Description; if (response.ErrorMessages == null) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(response.ResponseObject); if (xmlDoc.SelectSingleNode(xpath) != null) { PerformanceTitle = xmlDoc.SelectSingleNode(xpath).InnerText; } } if (PerformanceTitle.IndexOf("Players Pack Voucher") != -1) { PerformanceTitle = "Players Pack Voucher"; } /* CODE FOR WEB CONTENT FIELD TITLE END */ <!-- Performance --> <tr> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 20px; text-transform: uppercase; margin: 0 0 10px;">@PerformanceTitle</h2> @if (!playersPackVenueId.Contains(performance.Facility.Id)) { <p class="performance-date" style="color: #fff; font-family: Helvetica, Arial, sans-serif; text-transform: uppercase; font-weight: bold; font-size: 16px; margin: 0 0 5px;">@performance.PerformanceDateTime.ToString("MM/dd/yyyy h:mm tt")</p> <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> @performance.Facility.Description - @product.Performance.LineItem.SubLineItems[0].Zone.Description - @foreach (var subLineItem in product.Performance.LineItem.SubLineItems) { var seatRow = string.IsNullOrEmpty(subLineItem.Seat.Number) ? "TBD" : subLineItem.Seat.Row + "" + subLineItem.Seat.Number + " "; @seatRow } </p> @*in the below 'if' line, add 'product.Performance.LineItem.Performance.Type.Id != 10 &&' if we would like to go back to suppressing the date & time for Digital perfs*@ } @* @if (playersPackVenueId.Contains(performance.Facility.Id)) { if (product.Performance.LineItem.SubLineItems.First().PriceType.Id != streamCompPricetypeID && product.Performance.LineItem.Performance.Type.Id != 9) {<p class="performance-date" style="color: #fff; font-family: Helvetica, Arial, sans-serif; text-transform: uppercase; font-weight: bold; font-size: 16px; margin: 0 0 5px;">@performance.PerformanceDateTime.ToString("MM/dd/yyyy h:mm tt")</p>} <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> </p> } *@ <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0;"> @foreach (var subLineItem in product.Performance.LineItem.SubLineItems.GroupBy(x => x.PriceType.Id)) { if (subLineItem.First().PriceType.Description.IndexOf("Players Pack") != -1) { <span>@subLineItem.Count() x Players Pack</span> } else { <span>@subLineItem.Count() x @subLineItem.First().PriceType.Description</span> } }</p> @*If the order is Print at Home, and an ETicket Release Date has been set, and the date is in the future, display the date*@ <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 12px; margin: 0; line-height: 0.7"> @if (IsPAH) { //Fetch the ETicket Release Date for this performance in this MOS var PerfPkgMOSResponse = Model.RestClient.AtUrl("TXN/PerformancePackageModeOfSales?modeOfSaleId=" + Model.OrderProductView.ModeOfSale.Id + "&performanceIds=" + performance.Id).Get<PerformancePackageModeOfSales>(); if (PerfPkgMOSResponse.IsSuccessful) { //If a date is set and it's in the future, display it if (PerfPkgMOSResponse.ResponseObject[0].ETicketReleaseDateTime != null && PerfPkgMOSResponse.ResponseObject[0].ETicketReleaseDateTime > DateTime.Now) { <br /><i>Tickets will be emailed at: @PerfPkgMOSResponse.ResponseObject[0].ETicketReleaseDateTime.Value.ToString("M/d/yy h:mm tt")</i> } } } </p> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> @if (!playersPackVenueId.Contains(performance.Facility.Id)) { if (product.Performance.LineItem.SubLineItems.First().PriceType.Id == playersPackPriceTypeId && !playersPackVenueId.Contains(performance.Facility.Id)) { decimal lineItemPrice = 0; foreach (var perfVoucher in perfs) { if ( product.Performance.LineItem.SubLineItems.First().PriceType.Id == playersPackPriceTypeId && playersPackVenueId.Contains(perfVoucher.Performance.LineItem.Performance.Facility.Id) && !playersPackVouchersLineItemIds.Contains(perfVoucher.Performance.LineItem.Id) ) { lineItemPrice = product.Performance.LineItem.SubLineItems.Count() * perfVoucher.Performance.LineItem.SubLineItems.First().DueAmount + product.Performance.LineItem.TotalDue; Array.Resize(ref playersPackVouchersLineItemIds, playersPackVouchersLineItemIds.Length + 1); playersPackVouchersLineItemIds[playersPackVouchersLineItemIds.GetUpperBound(0)] = perfVoucher.Performance.LineItem.Id; break; } } <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;">@string.Format("{0:C}", lineItemPrice)</p> } else { <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> @string.Format("{0:C}", product.Performance.LineItem.TotalDue)</p> } } </td> </tr> } } // for each performance /* PACKAGES */ var packages = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Package"); if (packages != null && packages.Count() > 0) { <!-- Package --> <tr> <td style="padding: 25px; background-color: #222;"> @{ var packageTotal = packages.Sum(x => x.Package.LineItems.Sum(y => y.TotalDue)); var superPackageId = 0; } @foreach (var product in packages) { if (superPackageId == 0 || superPackageId != product.Package.LineItems.First().SuperPackageId ) { foreach (var lineItem in product.Package.LineItems) { if ( lineItem.Performance == null) { if(superPackageId == 0 || superPackageId != lineItem.SuperPackageId){ /* CODE FOR WEB CONTENT FIELD TITLE START */ var PackageId = lineItem.Package.Id; IRestResponse<string> response = null; var url = "TXN/WebContents?packageIds=" + PackageId + "&contentTypeIds=3&showAll=true"; response = Model.RestClient.AtUrl(url).Get<string>(); var errorMessages = response.ErrorMessages; string xpath = "WebContentResults/WebContentResult//Value[1]"; var PackageTitle = lineItem.Package.Description; if (response.ErrorMessages == null) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(response.ResponseObject); if (xmlDoc.SelectSingleNode(xpath) != null) { PackageTitle = xmlDoc.SelectSingleNode(xpath).InnerText; } } /* CODE FOR WEB CONTENT FIELD TITLE END */ <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 20px; text-transform: uppercase; margin: 0 0 10px;"> @PackageTitle </h2> } } else { var performance = lineItem.Performance; /* CODE FOR SKIPPING PLAYERS PACK/Presale Pass DUMMY PERFORMANCES */ var pkgType = lineItem.Package.Type.Id; if (pkgType == 12 || pkgType == 11 || pkgType == 8 || pkgType == 31) { continue; } /* CODE FOR SKIPPING PATRON CHOICE DUMMY PERFORMANCES */ if (pkgType == 9 || pkgType == 10 || pkgType == 18 || pkgType == 19 || pkgType == 33) { if(lineItem.SpecialRequest != null && lineItem.SpecialRequest.Notes != null){ <li style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0;"> @lineItem.SpecialRequest.Notes </li> } continue; } /* CODE FOR SKIPPING Facility/Zone on EDU PERFORMANCES */ var eduPkg = lineItem.Package.Type.Id; var eduTitle = performance.Description; if (eduPkg == 29) { <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 20px; text-transform: uppercase; margin: 0 0 10px;"> @eduTitle<br> @performance.PerformanceDateTime.ToString("MM/dd/yyyy h:mm tt") </h2> continue; } /* CODE FOR WEB CONTENT FIELD TITLE START */ var PerformanceId = performance.Id; IRestResponse<string> response = null; var url = "TXN/WebContents?productionElementIds=" + PerformanceId + "&contentTypeIds=3&showAll=true"; response = Model.RestClient.AtUrl(url).Get<string>(); var errorMessages = response.ErrorMessages; string xpath = "WebContentResults/WebContentResult//Value[1]"; var PerformanceTitle = performance.Description; if (response.ErrorMessages == null) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(response.ResponseObject); if (xmlDoc.SelectSingleNode(xpath) != null) { PerformanceTitle = xmlDoc.SelectSingleNode(xpath).InnerText; } } /* CODE FOR WEB CONTENT FIELD TITLE END */ <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 20px; text-transform: uppercase; margin: 0 0 10px;"> @PerformanceTitle </h2> if (lineItem.SubLineItems[0].Seat.Id == 0 && lineItem.SubLineItems[0].Seat.Row == null && lineItem.SubLineItems[0].Seat.Number == null && lineItem.SubLineItems[0].Seat.Section == null) { <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> @performance.Facility.Description - @lineItem.SubLineItems[0].Zone.Description - TBD </p> } else if (pkgType == 32) {<p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> Online Access </p> } else { <!-- <p class="performance-date" style="color: #fff; font-family: Helvetica, Arial, sans-serif; text-transform: uppercase; font-weight: bold; font-size: 16px; margin: 0 0 5px;">@performance.PerformanceDateTime</p> --> <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> @performance.Facility.Description<br /> @lineItem.SubLineItems[0].Zone.Description @*If the order is Print at Home, and an ETicket Release Date has been set, and the date is in the future, display the date*@ @* @if (IsPAH) { //Fetch the ETicket Release Date for this performance in this MOS var PerfPkgMOSResponse = Model.RestClient.AtUrl("TXN/PerformancePackageModeOfSales?modeOfSaleId=" + Model.OrderProductView.ModeOfSale.Id + "&performanceIds=" + performance.Id).Get<PerformancePackageModeOfSales>(); if (PerfPkgMOSResponse.IsSuccessful) { //If a date is set and it's in the future, display it if (PerfPkgMOSResponse.ResponseObject[0].ETicketReleaseDateTime != null && PerfPkgMOSResponse.ResponseObject[0].ETicketReleaseDateTime > DateTime.Now) { <br /><i>Tickets will be emailed at: @PerfPkgMOSResponse.ResponseObject[0].ETicketReleaseDateTime.Value.ToString("M/d/yy h:mm tt")</i> } } } *@ </p> } } superPackageId = lineItem.SuperPackageId; } } } </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> <!-- $0.00 --> </p> </td> </tr> } var packages2 = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Package"); if (packages2 != null && packages2.Count() > 0) { foreach (var product in packages2) { var pkgID = product.Package.Id; if (pkgID > 0) { var PackageId = product.Package.Id; IRestResponse<string> response = null; var url = "TXN/WebContents?packageIds=" + PackageId + "&contentTypeIds=27&showAll=true"; response = Model.RestClient.AtUrl(url).Get<string>(); var errorMessages = response.ErrorMessages; string xpath = "WebContentResults/WebContentResult//Value[1]"; var packagetext = ""; if (response.ErrorMessages == null) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(response.ResponseObject); if (xmlDoc.SelectSingleNode(xpath) != null) { packagetext = xmlDoc.SelectSingleNode(xpath).InnerText; } } <tr> <td> @if (packagetext != "") { <p style="width: auto; color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0"> @packagetext</p> } </td> </tr> } } } // for each package /* GIFT CERTIFICATES */ var giftCertificates = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Gift Certificate"); var giftCertificateTotal = giftCertificates.Sum(x => -x.GiftCertificate.Amount); if (giftCertificates != null && giftCertificates.Count() > 0) { <!-- Gift Certificates --> <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 25px; text-transform: uppercase; margin: 0 0 10px;"> Gift Certificate(s) </h2> @foreach (var giftCertificate in giftCertificates) { var amount = -giftCertificate.GiftCertificate.Amount; <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> Redemption Code: @giftCertificate.GiftCertificate.GiftCertificateNumber<br /> @string.Format("{0:C}", amount) </p> } </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> @string.Format("{0:C}", giftCertificateTotal) </p> </td> </tr> } <!-- Fees --> if (packages != null && packages.Count() > 0) { } else { <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 20px; text-transform: uppercase; margin: 0 0 10px;"> Fees </h2> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> @string.Format("{0:C}", Model.OrderProductView.TotalFeeAmount) </p> </td> </tr> } if (giftcertificatePayments != null && giftcertificatePayments.Count() > 0) { <!-- Gift Certificates --> <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 25px; text-transform: uppercase; margin: 0 0 10px;"> Gift Certificate Redemption(s) </h2> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> - @string.Format("{0:C}", giftcertificatePaymentsTotal) </p> </td> </tr> } if(hasRoundUps) { <!-- Memberships (On Account) --> foreach (var roundUp in roundUps) { var roundUpAmount = @roundUp.Amount * -1; <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 25px; text-transform: uppercase; margin: 0 0 10px;"> Contribution </h2> <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> Contribution </p> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> @string.Format("{0:C}", roundUpAmount) </p> </td> </tr> } } if(hasOnAccountPayments && onAccountPaymentsTotal > 0) { <!-- On Account Payments --> <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 25px; text-transform: uppercase; margin: 0 0 10px;"> TOTAL CREDIT USED </h2> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> - @string.Format("{0:C}", onAccountPaymentsTotal) </p> </td> </tr> } /* ORDER TOTALS */ var subTotal = string.Format("{0:C}", Model.OrderProductView.TotalPurchaseAmount + Model.OrderProductView.TotalContributionAmount); <tr> <td colspan="2" style="padding: 20px;"> <table width="100%" style="border-collapse: collapse; border-spacing: 0;"> <tbody> <!-- Total --> <tr class="basket-total" style="font-size: 20px; font-weight: bold;"> <td style="color: #fff; font-family: Helvetica, Arial, sans-serif; border-top: 1px solid #fff; padding: 10px 0;">Total:</td> @if(Model.OrderProductView.TotalDueAmount + giftCertificateTotal + MembershipsPaymentsTotal + RoundUpsPaymentsTotal + PhantomPaymentsTotal - onAccountPaymentsTotal - giftcertificatePaymentsTotal < 0){ <td style="color: #fff; font-family: Helvetica, Arial, sans-serif; text-align: right; border-top: 1px solid #fff; padding: 10px 0;">@string.Format("{0:C}", 0)</td> } else { <td style="color: #fff; font-family: Helvetica, Arial, sans-serif; text-align: right; border-top: 1px solid #fff; padding: 10px 0;">@string.Format("{0:C}", (Model.OrderProductView.TotalDueAmount + giftCertificateTotal + MembershipsPaymentsTotal + RoundUpsPaymentsTotal + PhantomPaymentsTotal - onAccountPaymentsTotal - giftcertificatePaymentsTotal))</td> } </tr> </tbody> </table> </td> </tr> } else { if(hasSeatName) { <!-- Seat Naming (On Account) --> foreach (var namingContent in seatName) { var seatNameAmount = @namingContent.Amount * -1; <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 25px; text-transform: uppercase; margin: 0 0 10px;"> Named Seat in the Bagley Wright Theater </h2> <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> Contribution </p> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> @string.Format("{0:C}", seatNameAmount) </p> </td> </tr> } } else { if(hasMemberships) { <!-- Memberships (On Account) --> foreach (var membership in memberships) { var membershipAmount = @membership.Amount * -1; <tr style="padding: 30px;"> <td style="padding: 25px; background-color: #222;"> <h2 class="performance-title" style="color: #fff; font-family:Impact, Arial Black, Helvetica, sans-serif; font-weight:normal; font-size: 24px; text-transform: uppercase; margin: 0 0 10px;"> Contribution </h2> <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> Contribution </p> </td> <td style="width: 100px; text-align: right; padding: 20px; background-color: #222; vertical-align: bottom;"> <p class="performance-total" style="color: #fff; font-family: Helvetica, Arial, sans-serif; margin: 0; font-size: 20px;"> @string.Format("{0:C}", membershipAmount) </p> </td> </tr> } } } } </tbody> </table> </td> </tr> </tbody> </table> <!-- Footer --> <table align="center" width="100%" style="background-color: #111; border-collapse: collapse; border-spacing: 0;"> <tbody> <!--added here--> <tr> <td class="footer" style="padding: 30px 20px;"> <table width="100%" align="center" style="max-width: 600px; background-color: #111; border-collapse: collapse; border-spacing: 0;"> <tbody> @if(hasGalaProducts){<tr> <!-- Director Details --> <td style="vertical-align: top;"> <p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0 0 5px; line-height: 1.2;"> Thank you for registering for Seattle Rep’s Revel + Raise! Whether you are joining the revelry in person or from afar, we cannot wait to raise a glass—and funds—with you in support of Seattle Rep’s mission-driven productions and programs. If you are attending, we look forward to seeing you on Saturday, April 1, 2023!<br><br> If you have any questions, please contact Donor Stewardship & Events Manager Katelyn Woods at <a href="mailto:katelyn.woods@seattlerep.org" style="color: #01D4CD">katelyn.woods@seattlerep.org</a> or 206.457.3854.<br><br> You will receive further documentation including an itemized receipt with Fair Market Value for your transactions following the event. </p> </td> </tr>} <!-- end added bit--> <tr> <td class="footer" style="padding: 40px 30px;"> <table width="100%" align="center" style="max-width: 600px; background-color: #111; border-collapse: collapse; border-spacing: 0;"> <tbody> <tr> <!-- Director Details --> <td style="vertical-align: top;"> <h3 style="text-transform: uppercase; font-family: Arial Black, sans-serif; color: #fff; font-weight: 800;">Seattle Rep</h3> <p class="footer-people" style="font-family: Helvetica, Arial, sans-serif; color: #fff; line-height: 1.5;"><strong>Dámaso Rodríguez</strong> Artistic Director<br><strong>Jeffrey Herrmann</strong> Managing Director</p> </td> <!-- Address Details --> <td style="vertical-align: bottom;"> <p class="footer-people" style="font-family: Helvetica, Arial, sans-serif; color: #fff; line-height: 1.5;"><strong>155 Mercer Street</strong><br> PO Box 900923 | Seattle, WA 98109</p> </td> </tr> <!-- Season Sponsor --> <tr> <td colspan="2" style="text-align: center; padding: 40px 0;"> <img src="https://blocksoffice.s3-eu-west-1.amazonaws.com/seattlerep-test/arts-fund-logo.png" width="200" heigh="35" /> <h4 style="font-family: Helvetica, Arial, sans-serif; color: #fff; font-weight: normal; margin: 10px 0; font-size: 14px; text-transform: uppercase;">Season Sponsor</h4> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </body> </html>
Thanks Ryan! We are on v16 already, the default one is OK, however there are some very useful features we want to use that we cannot add to the default one.... Ex: QR code on the top right for the ability to scan via NSCAN if someone can't find their PDF tickets but can find the order confirmation email, and the ability to add a scannable digital membership card on new membership purchases, also to be able to easily scan via NSCAN.
Oh, and custom website - not TNEW!
Hi Mark,
Thanks for getting this thread started. I thought that ours had price types like you were hoping, but I misremembered. It's just prices. We do have some stuff in here that hides the seat information for certain locations. We don't want seat info for our General Admission or Drama School Registrations. We also have some text at the bottom that only shows up for drama school classes. It pulls in the recipient (where we store student name) and ticket text from the performance/class so that we can provide additional details about the date range and location of the class, as well as policy copy.For yours, I think an easy change would be updating the colors to match your brand, and adding a logo at the top.I am including a screenshot of the top of a ticket order, the bottom of a drama school order, and a text file with the full template script.We also have a custom website.
<!-- JCA version 8.3.23 updated by JCA to add drama school recipients, drama school ticket text, header and footer --> @using Tessitura.Service.Client.CRM; @using Tessitura.Service.Client.Txn; @{ var hasConstituent = Model.OrderProductView.Constituent != null; var hasAddress = Model.Address != null; var hasElectronicAddress = Model.ElectronicAddress != null; var hasBooking = Model.Booking != null; var isInFriendsCircle = false; var hasState = hasAddress && Model.Address.State != null; var hasProducts = Model.OrderProductView.Products != null && Model.OrderProductView.Products.Count > 0; var regnum = 0; var hasPaymentPlan = Model.OrderProductView.PaymentPlans != null; var objectRecipient = hasProducts ? Model.OrderProductView.Products.FirstOrDefault() : null; var objectPerformance = (objectRecipient != null) ? objectRecipient.Performance : null; var objectSubLineItem = objectPerformance != null ? objectPerformance.LineItem.SubLineItems.FirstOrDefault() : null; //var recipient = objectSubLineItem != null ? (objectSubLineItem.Recipient != null ? (objectSubLineItem.Recipient.DisplayName != null ? objectSubLineItem.Recipient.DisplayName : string.Empty): string.Empty) : string.Empty; } @if (hasConstituent) { var url = "CRM/Constituencies?constituentId=" + Model.OrderProductView.Constituent.Id + "&includeAffiliations=true"; var constituencies = Model.RestClient.AtUrl(url).Get<Constituencies>().ResponseObject; isInFriendsCircle = constituencies != null && constituencies.Count(x => x.ConstituencyType.ShortDescription == "FRC") > 0; } <table width="700" style="font-size: 12px; text-align:left color: #000000; font-family:Arial, Helvetica, sans-serif";> <tr> <td align="left" valign="top"> <table width="100%" style="vertical-align: top;text-align:left"> <!-- JCA: LOGO --> <tr> <td colspan="2" style="text-align:left"> <img src="https://cdn.sct.org/img/logo.png" alt="Seattle Children’s Theatre" /> <!-- REPLACE IMAGE SOURCE HERE --> </td> </tr> <!-- END JCA: LOGO --> <tr> <td colspan="2" style="text-align:left"> <h3>Seattle Children's Theatre thanks you!</h3> <b>Order Date:</b> @Model.OrderProductView.OrderDateTime <br /> <b>Order Number:</b> @Model.OrderProductView.Id<br /> @if (hasConstituent) { <b>Customer Number:</b> @Model.OrderProductView.Constituent.Id <br /> <br /> } <p style="margin-top: -10px; padding-bottom: 20px;"><small>Please retain this receipt for your reference. <br />Our Tax ID Number is 51-0172421. </small></p> <b>Review our detailed COVID policy before your visit:<a href= "http://www.sct.org/safety">www.sct.org/safety</a> </b> </br> </br> </br> </td> </tr> @{ var state = hasState ? ", " + Model.Address.State.StateCode : ""; var electronicAddress = hasElectronicAddress ? Model.ElectronicAddress.Address : ""; } <tr> <td width="50%" style="padding-bottom: 20px; vertical-align: top;"> <b>Your Account Information:</b><BR /> @if (isInFriendsCircle) { <text>Thank you for being a Supporter of SCT!<br /></text> } @if (hasConstituent) { @Model.OrderProductView.Constituent.DisplayName <br /> } @if (hasAddress) { @Model.Address.Street1<br /> @Model.Address.City@state @Model.Address.PostalCode<br /> } @electronicAddress<br /> </td> <td width="50%" style="padding-bottom: 20px; text-align: left;vertical-align: top"> <b>Order Shipping Information</b><BR /> @if (Model.OrderProductView.DeliveryMethod.Id == -1) { <text> Thank you! No items in your order will be shipped. Tickets will be held at the SCT ticket office on the north side of the building.</text><br /> } @if (Model.OrderProductView.DeliveryMethod.Id == 2) { <text> Thank you for choosing Print at Home Delivery. <br>Your tickets will be emailed 14 days prior to your performance as an attached pdf in a separate email. You may find your tickets in junk, spam, promotions, or clutter folders within your inbox. <Br>If you do not receive your tickets via email within 14 days of your performance, please contact the ticket office by replying to this email or via phone at 206.441.3322. <br>If you purchased your tickets within 14 days from the performance, your tickets will be emailed within 30 minutes of purchase.</text><br /> } @if (Model.OrderProductView.DeliveryMethod.Id == 1) { <text> @Model.Address.Street1<br /> @Model.Address.City@state @Model.Address.PostalCode<br /> </text> } </td> </tr> </table> </td> </tr> @if (hasProducts) { var perfs = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Performance"); if (perfs != null && perfs.Count() > 0) { <tr> <td align="left" valign="top"> <table align="left" style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif;"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top"> <b>Performances</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <table width="700" style="vertical-align: top; text-align: left"> <tr> <th width="250" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Description</th> <th width="150" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Location</th> <th width="100" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Seat(s)</th> <th width="85" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: right">Price</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: right">Total</th> </tr> @{ var performanceTotal = @perfs.Sum(x => x.Performance.LineItem.TotalDue); } @foreach (var product in perfs) { var performance = product.Performance.LineItem.Performance; <tr> <td> @performance.Description<br/> @performance.Facility.Description<br/> @performance.PerformanceDateTime </td> <td style="vertical-align: top"> @product.Performance.LineItem.SubLineItems[0].Zone.Description </td> <td style="vertical-align: top"> <!-- Added 3/25/19 to hide seat numbers depending on Location --> @foreach (var subLineItem in product.Performance.LineItem.SubLineItems) { if (@product.Performance.LineItem.SubLineItems[0].Zone.Description == "Extended Experience" ||@product.Performance.LineItem.SubLineItems[0].Zone.Description == "Premium" || @product.Performance.LineItem.SubLineItems[0].Zone.Description == "Standard" || @product.Performance.LineItem.SubLineItems[0].Zone.Description == "Value" ) { var seatRow = string.IsNullOrEmpty(subLineItem.Seat.Number) ? "TBD" : subLineItem.Seat.Row + " " + subLineItem.Seat.Number; @seatRow<br/> } else { var seatRow = " "; @seatRow<br/> } if (@product.Performance.LineItem.SubLineItems[0].Zone.Description == "Registrant") { regnum = 1; } } </td> <td style="vertical-align: top; text-align: right"> @foreach (var subLineItem in product.Performance.LineItem.SubLineItems) { var amount = string.Format("{0:C}", subLineItem.DueAmount); @amount<br/> } </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", product.Performance.LineItem.TotalDue) </td> </tr> } <tr> <td colspan="4" style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right;"> <b>Total Single Tickets Cost:</b> </td> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right;"> <b>@string.Format("{0:C}", performanceTotal)</b> </td> </tr> </table> </td> </tr> </table> </td> </tr> } var packages = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Package"); if (packages != null && packages.Count() > 0) { <tr> <td align="left" valign="top"> <table align="left" style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif;"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top"> <b>Packages</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <table width="700" style="vertical-align: top; text-align: left"> <tr> <th width="255" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Description</th> <th width="150" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Location</th> <th width="100" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Seat(s)</th> <th width="85" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: left">Price</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; vertical-align: top; text-align: right">Total</th> </tr> @{ var packageTotal = @packages.Sum(x => x.Package.LineItems.Sum(y => y.TotalDue)); } @foreach (var product in packages) { foreach (var lineItem in product.Package.LineItems) { //if (lineItem.Performance.Id == 0) if (lineItem.Performance == null) { <tr> <td colspan="5" style="text-align: left; vertical-align: top"> <b>@lineItem.Package.Description</b> </td> </tr> } else { var performance = @lineItem.Performance; <tr> <td> @performance.Description<br/> @performance.Facility.Description<br/> @performance.PerformanceDateTime </td> <td style="vertical-align: top"> @lineItem.SubLineItems[0].Zone.Description </td> <td style="vertical-align: top"> <!-- Added 3/25/19 to hide seat numbers depending on Location --> @foreach (var subLineItem in lineItem.SubLineItems) { if (@lineItem.SubLineItems[0].Zone.Description == "Extended Experience" || @lineItem.SubLineItems[0].Zone.Description == "Premium" || @lineItem.SubLineItems[0].Zone.Description == "Standard" || @lineItem.SubLineItems[0].Zone.Description == "Value" ) { var seatRow = string.IsNullOrEmpty(subLineItem.Seat.Number) ? "TBD" : subLineItem.Seat.Row + " " + subLineItem.Seat.Number; @seatRow<br/> } else { var seatRow = " "; @seatRow<br/> } } </td> <td style="vertical-align: top; text-align: right"> @foreach (var subLineItem in lineItem.SubLineItems) { var amount = string.Format("{0:C}", subLineItem.DueAmount); @amount<br/> } </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", lineItem.TotalDue) </td> </tr> } } } <tr> <td colspan="4" style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Total Packages Cost:</b> </td> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; text-align: right"> <b>@string.Format("{0:C}", packageTotal)</b> </td> </tr> </table> </td> </tr> </table> </td> </tr> } var contributions = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Contribution"); var contributionTotal = contributions.Sum(x => x.Contribution.Amount); if (contributions != null && contributions.Count() > 0) { <tr> <td align="left" valign="top"> <table style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif;"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top"> <b>Contributions</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <table width="700" style="vertical-align: top; text-align: left"> <tr> <th width="600" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: left; vertical-align: top">Description</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: right; vertical-align: top">Total</th> </tr> @foreach (var contribution in contributions) { <tr> <td> @contribution.Contribution.Fund.Description </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", contribution.Contribution.Amount) </td> </tr> } <tr> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Total Contribution Cost:</b> </td> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; text-align: right"> <b>@string.Format("{0:C}", contributionTotal)</b> </td> </tr> </table> </td> </tr> </table> </td> </tr> } var memberships = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Membership"); var membershipTotal = memberships.Sum(x => x.Membership.Amount); if (memberships != null && memberships.Count() > 0) { <tr> <td align="left" valign="top"> <table style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif; text-align: left"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top"> <b>Donations</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <table width="700" style="vertical-align: top; text-align: left"> <tr> <th width="600" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: left; vertical-align: top">Donor Level Description</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: right; vertical-align: top">Total</th> </tr> @foreach (var membership in memberships) { <tr> <td> @membership.Membership.MembershipLevel.Description </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", membership.Membership.Amount) </td> </tr> } <tr> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Total Donation:</b> </td> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; text-align: right"> <b>@string.Format("{0:C}", membershipTotal)</b> </td> </tr> </table> </td> </tr> <text> Thank you! If you have made a donation of $25 or more, our Development Department will contact you shortly with a tax receipt.</text><br /><br /> </table> </td> </tr> } var giftCertificates = Model.OrderProductView.Products.Where(x => x.ProductClass.Description == "Gift Certificate"); var giftCertificateTotal = giftCertificates.Sum(x => -x.GiftCertificate.Amount); if (giftCertificates != null && giftCertificates.Count() > 0) { <tr> <td align="left" valign="top"> <table style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif; text-align: left"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top"> <b>Gift Certificates</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <table width="700" style="vertical-align: top; text-align: left"> <tr> <th width="600" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: left; vertical-align: top">Description</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: right; vertical-align: top">Total</th> </tr> @foreach (var giftCertificate in giftCertificates) { var amount = -giftCertificate.GiftCertificate.Amount; <tr> <td> Redemption Code: @giftCertificate.GiftCertificate.GiftCertificateNumber </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", amount) </td> </tr> } <tr> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Total Gift Certificate Cost:</b> </td> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; text-align: right"> <b>@string.Format("{0:C}", giftCertificateTotal)</b> </td> </tr> </table> </td> </tr> </table> </td> </tr> } var subTotal = string.Format("{0:C}", Model.OrderProductView.TotalPurchaseAmount + Model.OrderProductView.TotalContributionAmount); <tr> <td colspan="2"> <table width="700" style="padding-top: 20px;"> <tr> <td width="600" style="color: #6e6d6d; vertical-align: top; text-align: right"> <b> </b> <!-- Removed Order Subtotal: --> </td> <td style="color: #6e6d6d; vertical-align: top; text-align: right"> </td> <!-- Removed @subTotal --> </tr> <tr> <td style="color: #6e6d6d; vertical-align: top; text-align: right"> <b>Fees:</b> </td> <td style="color: #6e6d6d; vertical-align: top; text-align: right"> <b>@string.Format("{0:C}", Model.OrderProductView.TotalFeeAmount)</b> </td> </tr> <tr> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Order Total:</b> </td> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> @string.Format("{0:C}", Model.OrderProductView.TotalDueAmount) </td> </tr> </table> </td> </tr> } @if (Model.OrderProductView.Payments != null && Model.OrderProductView.Payments.Count() > 0) { <tr> <td align="left" valign="top"> <table width="700" style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif;"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top" colspan="2"> <b>Payments</b> </th> </tr> <tr> <td style="text-align: left; vertical-align: top"> <tr> <th width="600" style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: left; vertical-align: top">Description</th> <th style="background-color: #FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline; color: #ED008C; text-align: right; vertical-align: top">Total</th> </tr> @foreach (var payment in Model.OrderProductView.Payments) { <tr> <td> @if (payment.PaymentMethod.AccountType != null) { @payment.PaymentMethod.AccountType.Description } else { @payment.PaymentMethod.Description } @if (payment.LastFourCreditCardNumber != null) { string ccNum = "(-" + payment.LastFourCreditCardNumber + ")"; @ccNum } @if (payment.CheckNumber != null) { string checkNum = "(#" + payment.CheckNumber + ")"; @checkNum } @if (payment.GiftCertificateNumber != null) { string gcNum = "(" + payment.GiftCertificateNumber + ")"; @gcNum } </td> <td style="vertical-align: top; text-align: right"> @string.Format("{0:C}", payment.Amount) </td> </tr> } <tr> <td style="border-top: 1px solid #ED008C; color: #6e6d6d; vertical-align: top; text-align: right"> <b>Total Payments:</b> </td> <td style="border-top: 1px solid #ED008C; text-align: right"> @string.Format("{0:C}", Model.OrderProductView.Payments.Sum(x => x.Amount)) </td> </tr> </td> </tr> </table> </td> </tr> } @if (hasBooking) { <tr> <td> <table style="font-size: 12px; color: #000000; font-family:Arial, Helvetica, sans-serif; text-align: left"> <tr> <th colspan="3" style="background-color: #ED008C;color: #ffffff;font-weight: bold;font-size: 12px;text-align: left;vertical-align: top"> <b>Booking</b> </th> </tr> <tr> <td><h3>@Model.Booking.Description </h3></td> </tr> <tr> <td><h4>Confirmation: @Model.Booking.ConfirmationText </h4></td> </tr> @if (Model.Booking.Assignments != null && Model.Booking.Assignments.Count > 0) { <tr> <td><b>Resources</b></td> </tr> <tr> <td style="text-align:left;vertical-align:top"> <table style="vertical-align: top;text-align:left"> <tr> <th width="140" style="background-color:#FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline;color: #ED008C; vertical-align: top;text-align:left">Type</th> <th width="200" style="background-color:#FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline;color: #ED008C; vertical-align: top;text-align:left">Description</th> <th width="60" style="background-color:#FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline;color: #ED008C; vertical-align: top;text-align:left">Count</th> <th width="150" style="background-color:#FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline;color: #ED008C; vertical-align: top;text-align:left">Start</th> <th width="150" style="background-color:#FFFFFF ! important; font-size: 11px ! important; font-weight: bold; text-decoration: underline;color: #ED008C; vertical-align: top;text-align:left">End</th> </tr> @foreach (var assignment in @Model.Booking.Assignments) { var description = @assignment.Resource != null ? @assignment.Resource.Description : "TBD"; <tr> <td>@assignment.ResourceType.Description</td> <td>@description</td> <td>@assignment.Schedule.Count</td> <td>@assignment.Schedule.StartDateTime</td> <td>@assignment.Schedule.EndDateTime</td> </tr> if (assignment.ConfirmationText != null) { <tr> <td></td> <td colspan="4">@assignment.ConfirmationText</td> </tr> } } </table> </td> </tr> } </table> </td> </tr> } @if (hasPaymentPlan) { <tr> <td align="left" valign="top"> <table width="700" style="font-size: 12px; color: #000000; font-family: Arial, Helvetica, sans-serif;"> <tr> <th style="background-color: #ED008C; color: #ffffff; font-weight: bold; font-size: 12px; text-align: left; vertical-align: top" colspan="2"> <b>Your Payment Plan</b> </th> <text><tr><td>Your payments will be processed automatically according to the following schedule: </td></tr></text>; <tr> <td width="200" style="color: #000000; vertical-align: top; text-align: right"> <b>Payment 1 Amount:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @string.Format("{0:C}", @Model.OrderProductView.PaymentPlans.First().AmountDue) </td> </tr> <tr> <td style="color: #000000; vertical-align: top; text-align: right"> <b>Payment 1 Date:</b> </td> <td style="color: #000000; vertical-align: top; text-align: left"> @{ DateTime dueDate1 = Convert.ToDateTime(@Model.OrderProductView.PaymentPlans.First().DateDue); string dateFormat1 = "MMMM dd, yyyy"; var dueDateString1 = dueDate1.ToString(dateFormat1); } @dueDateString1 </td> </tr> @if (@Model.OrderProductView.PaymentPlans.Count > 1) { <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 2 Amount:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @string.Format("{0:C}", @Model.OrderProductView.PaymentPlans.ElementAt(1).AmountDue) </td> </tr> <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 2 Date:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @{ DateTime dueDate2 = Convert.ToDateTime(@Model.OrderProductView.PaymentPlans.ElementAt(1).DateDue); string dateFormat2 = "MMMM dd, yyyy"; var dueDateString2 = dueDate2.ToString(dateFormat2); } @dueDateString2 </td> </tr> } @if (@Model.OrderProductView.PaymentPlans.Count > 2) { <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 3 Amount:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @string.Format("{0:C}", @Model.OrderProductView.PaymentPlans.ElementAt(2).AmountDue) </td> </tr> <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 3 Date:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @{ DateTime dueDate3 = Convert.ToDateTime(@Model.OrderProductView.PaymentPlans.ElementAt(2).DateDue); string dateFormat3 = "MMMM dd, yyyy"; var dueDateString3 = dueDate3.ToString(dateFormat3); } @dueDateString3 </td> </tr> } @if (@Model.OrderProductView.PaymentPlans.Count > 3) { <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 4 Amount:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @string.Format("{0:C}", @Model.OrderProductView.PaymentPlans.ElementAt(3).AmountDue) </td> </tr> <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 4 Date:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @{ DateTime dueDate4 = Convert.ToDateTime(@Model.OrderProductView.PaymentPlans.ElementAt(3).DateDue); string dateFormat4 = "MMMM dd, yyyy"; var dueDateString4 = dueDate4.ToString(dateFormat4); } @dueDateString4 </td> </tr> } @if (@Model.OrderProductView.PaymentPlans.Count > 4) { <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 5 Amount:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @string.Format("{0:C}", @Model.OrderProductView.PaymentPlans.ElementAt(4).AmountDue) </td> </tr> <tr> <td style="vertical-align: top; text-align: right; color: #000000;"> <b>Payment 5 Date:</b> </td> <td style="vertical-align: top; text-align: left; color: #000000;"> @{ DateTime dueDate5 = Convert.ToDateTime(@Model.OrderProductView.PaymentPlans.ElementAt(4).DateDue); string dateFormat5 = "MMMM dd, yyyy"; var dueDateString5 = dueDate5.ToString(dateFormat5); } @dueDateString5 </td> </tr> } </table> </td> </tr> } @if (regnum == 1) { <td colspan="4" style="border-top: 1px solid #ed008c; color: #000000; vertical-align: top; text-align: right;"> <text><tr><td><br> <!-- JCA: Drama School Personalization --> @if(hasProducts) { var perfs = (Model.OrderProductView.Products).Where(x => x.ProductClass.Description == "Performance"); if (perfs != null && perfs.Count() > 0) { <h2>Drama School Registration:</h2> foreach (var product in perfs) { var performance = product.Performance.LineItem.Performance; var urlInventory = "TXN/Performances/" + performance.Id; var inventoryObject = Model.RestClient.AtUrl(urlInventory).Get<Performance>().ResponseObject; var objectSLI = product.Performance.LineItem.SubLineItems; foreach (var sli in objectSLI) { var recipient = sli.Recipient.DisplayName; if(!performance.Description.Contains("T-Shirt") && !performance.Description.Contains("Hoodie")) { <b> @recipient has been registered for: </b> <br> } } if(!performance.Description.Contains("T-Shirt") && !performance.Description.Contains("Hoodie")) { @inventoryObject.Text1 <br> @inventoryObject.Text2 <br> @inventoryObject.Text3 <br> @inventoryObject.Text4 <br><br> } } } } You will receive additional confirmation materials closer to your class start date. If you have questions about in-person learning at SCT or our partnership camps, check out our <a href="https://www.sct.org/education-programs/drama-school-frequently-asked-questions/">FAQ</a> and <a href="https://www.sct.org/about-us/policies/drama-school-policies/">health guidelines</a> here. We're looking forward to having you with us! If you have questions about your registration, please email <a href="mailto:dramaschool@sct.org"> Drama School </a> or call 206.859.4079. <br> <br> <h3>Class Cancellation Policy:</h3> <!-- END JCA: Drama School Personalization --> If you cancel your registration <b>at least two weeks</b> before the class begins, we will refund tuition less the registration fee - $25 per class or $50 for full-day classes and camps. <br><br> <b>If you cancel your registration with less than the required notice, no refund will be given.</b> Any tuition paid for the cancelled class, minus the registration fee, becomes a credit which you may use towards either Drama School tuition through the current school year or tickets for the current Mainstage season. Any lesser tuition costs from the new class will not be refunded. If we do not receive prior cancellation notice and you do not attend the first day of class, no refund or credit will be given. <br><br> Switching Classes: You may switch from one class to another more than two weeks before the class begins without incurring another registration fee ($25 per class, $50 for full-day classes and camps). If you switch less than two weeks before the beginning of the class, you must pay the additional registration fee, plus any additional tuition for a higher priced class, if applicable. </td></tr></text> </td> } </table> <!-- JCA: WordFly Footer --> <br> <br> <table width="700" style="font-size: 12px; text-align:left color: #000000; font-family:Arial, Helvetica, sans-serif";> <tr> <td> <div id="block-container-1683145076250" class="block mobile-hide" style="clear: both; overflow: hidden; zoom: 1; background-color: rgb(0, 0, 0); font-family: Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> <div id="block-container-3276633260865" class="block mobile-hide" style="overflow: hidden; zoom: 1; font-family: Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> <div class="text-block block" id="text-block-3186975052618" style="overflow: hidden; zoom: 1; font-family: Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> <div style="font-family: Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> <h2 style="text-align: center; margin: 10px 0px; padding: 0px; color: rgb(255, 255, 255); font-family: Arial, Verdana, sans-serif; font-size: 18px;">SHARE YOUR STORY </h2> <p style="text-align: center; margin: 0px 0px 12px; font-size: 12px; line-height: 22px; color: rgb(255, 255, 255); font-family: Arial, Verdana, sans-serif;"> <!-- Facebook --> <a href="https://www.facebook.com/SeattleChildrensTheatre/" target="_blank" style="color: rgb(255, 255, 255); font-family: Arial, Verdana, sans-serif; font-weight: 700; text-decoration: none;"> <img src="https://media.wordfly.com/sct/blocks/icon-facebook.png" alt="facebook" width="32" height="27" style="border: 0px none rgb(255, 255, 255); outline: rgb(255, 255, 255) none 0px; text-decoration: none; font-size: 18px; margin: 0px; font-family: Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> </a> <!-- Instagram --> <a href="https://www.instagram.com/sct_seattle/" target="_blank" style="color: rgb(255, 255, 255); font-family: Arial, Verdana, sans-serif; font-weight: 700; text-decoration: none;"> <img src="https://media.wordfly.com/sct/blocks/icon-instagram.png" alt="instagram" width="32" height="27" style="border: 0px none rgb(255, 255, 255); outline: rgb(255, 255, 255) none 0px; text-decoration: none; font-size: 18px; margin: 0px; font-family: Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> </a> <!-- YouTube --> <a href="https://www.youtube.com/SCTPR" target="_blank" style="color: rgb(255, 255, 255); font-family: Arial, Verdana, sans-serif; font-weight: 700; text-decoration: none;"> <img src="https://media.wordfly.com/sct/blocks/icon-youtube.png" alt="youtube" width="32" height="27" style="border: 0px none rgb(255, 255, 255); outline: rgb(255, 255, 255) none 0px; text-decoration: none; font-size: 18px; margin: 0px; font-family: Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> </a> </p> </div> </div> </div> <div class="text-block block" id="text-block-3186973692009" style="overflow: hidden; zoom: 1; font-family: Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> <div style="font-family: Helvetica, Arial, Verdana, sans-serif; color: rgb(255, 255, 255);"> <p class="fine-print" style="text-align: center; margin: 0px 10px 12px; font-size: 12px; color: rgb(255, 255, 255); line-height: 16px; font-family: Arial, Verdana, sans-serif;" align="center">Thank you for being a part of the SCT family! We couldn’t do it without you. To ensure that emails from us make your day and land straight in your mailbox (we are not spam!), please add tickets@sct.org to your address book or safe list.<br></p> <p class="fine-print" style="text-align: center; margin: 0px 10px 12px; font-size: 12px; color: rgb(255, 255, 255); line-height: 16px; font-family: Arial, Verdana, sans-serif;" align="center">Seattle Children's Theatre 201 Thomas St. Seattle, WA 98109</p> </div> </div> </div> </div> </td> </tr> </table> <!-- END JCA: WordFly Footer -->
I should also show an example rendered!
Mark, the bit in our template that displays pricetype for single ticket orders starts at line 348 of my code, and I also pulled it here. We do have an if/else going on for a special, different voucher package, so you can ignore that part, but this might help you play with it.
<p style="color: #fff; font-family: Helvetica, Arial, sans-serif; font-size: 14px; margin: 0;"> @foreach (var subLineItem in product.Performance.LineItem.SubLineItems.GroupBy(x => x.PriceType.Id)) { if (subLineItem.First().PriceType.Description.IndexOf("Players Pack") != -1) { <span>@subLineItem.Count() x Players Pack</span> } else { <span>@subLineItem.Count() x @subLineItem.First().PriceType.Description</span> } }</p>